在 CREATE 上更改所有者的事件触发器
Event trigger to change owner on CREATE
我正在尝试创建一个 PostgreSQL 事件触发器,每当用户创建任何东西(table、视图、函数、序列...)并将这个新创建的东西的所有者设置为一定的作用。
到目前为止,我有 even 触发器本身,它会在任何 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; $$;
如何获取类型(如 table、视图等)以及如何获取新建对象的名称?
编辑:
看看this question and this question and of course CREATE EVENT TRIGGER and Trigger Procedures,这目前是不可能的:(
猜猜,我应该正确回答这个问题,而不仅仅是在编辑中:
我想要的目前是不可能的。也许未来对 Postgres 的更新会为事件触发器添加更多功能。
来源:
- http://www.postgresql.org/docs/current/static/sql-createeventtrigger.html
- http://www.postgresql.org/docs/current/static/plpgsql-trigger.html
- How to get the name of the altered table in a Postgres event trigger?
- How to get SQL text from Postgres event trigger
这对我来说效果很好,尽管它比需要的要宽一些。它基于 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();
我正在尝试创建一个 PostgreSQL 事件触发器,每当用户创建任何东西(table、视图、函数、序列...)并将这个新创建的东西的所有者设置为一定的作用。
到目前为止,我有 even 触发器本身,它会在任何 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; $$;
如何获取类型(如 table、视图等)以及如何获取新建对象的名称?
编辑: 看看this question and this question and of course CREATE EVENT TRIGGER and Trigger Procedures,这目前是不可能的:(
猜猜,我应该正确回答这个问题,而不仅仅是在编辑中: 我想要的目前是不可能的。也许未来对 Postgres 的更新会为事件触发器添加更多功能。
来源:
- http://www.postgresql.org/docs/current/static/sql-createeventtrigger.html
- http://www.postgresql.org/docs/current/static/plpgsql-trigger.html
- How to get the name of the altered table in a Postgres event trigger?
- How to get SQL text from Postgres event trigger
这对我来说效果很好,尽管它比需要的要宽一些。它基于 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();