在CREATE

时间:2016-01-09 16:28:24

标签: postgresql eventtrigger

我试图创建一个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 questionthis question,当然还有CREATE EVENT TRIGGERTrigger Procedures,目前还不太可能:(

2 个答案:

答案 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();
相关问题