我有一个表用户:
CREATE TABLE users (
id serial primary key,
name text,
status text,
tier text,
project text[]);
列项目是一个模式名称数组。我想创建一个触发器函数,当用户添加到表中时,该函数将赠款用户一组权限。一个用户可以访问多个模式,因此我的想法是循环遍历一个模式名称数组。
CREATE OR REPLACE FUNCTION common.add_user()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
u_name text = NEW.name;
m text;
project text[] = NEW.project;
begin
FOREACH m IN ARRAY project LOOP
EXECUTE 'GRANT USAGE ON SCHEMA ' || m || ' TO ' || u_name;
END LOOP;
RETURN NEW;
end;
$BODY$;
触发器:
CREATE TRIGGER add_user
BEFORE INSERT
ON common.users
FOR EACH ROW
EXECUTE PROCEDURE common.add_user();
当我向common.users表添加条目时:
INSERT INTO common.users (name, project) VALUES ('user01', '{"schema01", "schema02"}');
它执行时没有错误,一个条目被添加到表中,但没有授予任何特权。当然,我确保插入查询是由实际上可以授予那些特权的用户执行的。
1条答案
按热度按时间k3fezbri1#
实际上,我已经很接近了,也许是循环内部执行语法的问题?无论如何,这正是我想要的:
我还希望能够通过修改列项目中的值来轻松地管理对项目(模式)的访问。与表上的RLS一起管理权限现在非常简单。