我试图创建一个PostgreSQL事件触发器,只要用户创建任何内容(表,视图,函数,序列......)并将此新创建的事物的所有者设置为某个角色,就会触发该事件。 / p>
到目前为止,我有偶数触发器,它会触发任何CREATE命令:
CREATE EVENT TRIGGER setOwnerToMyRole ON ddl_command_end
WHEN tg_tag LIKE 'CREATE%'
EXECUTE PROCEDURE setOwnerToMyRole();
但是我遇到了函数本身的问题:
CREATE FUNCTION setOwnerToMyRole() RETURNS event_trigger LANGUAGE plpgsql
AS $$ BEGIN
ALTER <type> <name> OWNER TO myRole
END; $$;
如何获取类型(如表格,视图等)以及如何获取新创建的名称?
编辑: 查看this question和this question,当然还有CREATE EVENT TRIGGER和Trigger Procedures,目前还不太可能:(
答案 0 :(得分:0)
猜猜,我应该正确回答这个问题,而不仅仅是编辑: 我想要的目前是不可能的。也许对Postgres的未来更新将为eventtriggers添加更多功能。
来源:
答案 1 :(得分:0)
这对我来说非常有效,尽管它的网络比所需的要宽一些。它基于https://blog.hagander.net/setting-owner-at-create-table-237/
上的代码CREATE OR REPLACE FUNCTION trg_create_set_owner()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
obj record;
BEGIN
-- postgresql 9.5 or later:
-- FOR obj in SELECT table_name FROM pg_event_trigger_ddl_commands() WHERE command_tag='CREATE TABLE'
FOR obj IN SELECT tablename FROM pg_tables WHERE tableowner = current_user LOOP
EXECUTE format('ALTER TABLE %s OWNER TO my_group', obj.tablename);
END LOOP;
END;
$$;
CREATE EVENT TRIGGER trg_create_set_owner
ON ddl_command_end
WHEN tag IN ('CREATE TABLE', 'CREATE TABLE AS')
EXECUTE PROCEDURE trg_create_set_owner();