【问题标题】:Event trigger to change owner on CREATE在 CREATE 上更改所有者的事件触发器
【发布时间】:2020-06-16 09:10:08
【问题描述】:

我正在尝试创建一个 PostgreSQL 事件触发器,它会在用户创建任何内容(表、视图、函数、序列...)并将这个新创建的事物的所有者设置为特定角色时触发。

到目前为止,我有一个偶数触发器本身,它会在任何 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,目前这是不可能的:(

【问题讨论】:

    标签: postgresql eventtrigger


    【解决方案1】:

    这对我来说效果很好,尽管它比需要的网络要宽一些。它基于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();
    

    【讨论】:

      【解决方案2】:

      猜猜,我应该正确回答这个问题,而不仅仅是在编辑中: 我想要的目前是不可能的。也许未来对 Postgres 的更新会为事件触发器添加更多功能。

      来源:

      【讨论】:

      • 您能详细说明原因吗?目前尚不清楚为什么不是这种情况,人们一直在说它应该是可能的。我需要实现这样的东西。即使您没有从事件本身获得所需的文本,存在 CREATE 事件的事实也可能触发查询 pg_tables 以获取不属于目标角色的任何对象,然后使用 @987654327 进行更新@。你有没有尝试过这样的事情?
      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2018-08-07
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多