创建时事件触发器更改所有者

4

我正在尝试创建一个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; $$;

我该如何获取新创建的对象的类型(例如表格、视图等),以及它的名称?

编辑: 查看这个问题这个问题以及当然的CREATE EVENT TRIGGERTrigger Procedures,目前这是不太可能的:(

2个回答

3
这对我来说非常有效,尽管范围有点宽泛。它基于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();

0

1
你能详细解释一下为什么吗?为什么不行并且人们一直说这应该是可能的。我需要实现类似这样的东西。即使你从事件本身没有得到所需的文本,CREATE 事件的存在也可以触发查询 pg_tables,以查找任何不属于目标角色的对象,然后使用 ALTER TABLE <new_table> OWNER TO my_role 进行更新。你试过类似这样的方法吗? - Richard D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接