在Postgres中创建表时自动重新分配所有者

问题描述

我有一个模式为sandBox的Postgres数据库,其中角色bi_developer具有所有授权。

真实用户具有个人角色,其中bi_developer是父母。

但是,当某些用户创建新表时,其他用户没有权限。然后我一次又一次地为GRANT ALL ....制作bi_developer

有没有办法自动做到?

解决方法

我们尝试使用不同的变量,包括默认特权,但是在Greenplum安装中没有按预期工作,现在我们使用触发器,将所有新表转移为read_only角色:

-- CREATE FUNCTION
CREATE OR REPLACE FUNCTION sandbox.set_object_owner()
  RETURNS event_trigger
  LANGUAGE plpgsql
AS $$
  DECLARE
    obj record;
BEGIN
  FOR obj IN SELECT schemaname,objname,subtype 
    from pg_stat_operations 
        where schemaname = 'sandbox' 
    and actionname = 'CREATE'
    and subtype in ('TABLE','VIEW') 
  loop
    if obj.subtype = 'TABLE'
    then
      EXECUTE format('ALTER TABLE %s.%s OWNER TO read_only',obj.schemaname,obj.objname);
    end if;
    if obj.subtype = 'VIEW'
    then 
      EXECUTE format('ALTER VIEW %s.%s OWNER TO read_only',obj.objname);
    end if;
  END LOOP;
END;
$$

-- CREATE TRIGGER
CREATE EVENT TRIGGER trg_set_owner
  ON ddl_command_end
  WHEN tag IN ('CREATE TABLE','CREATE TABLE AS','CREATE VIEW')
EXECUTE PROCEDURE sandbox.set_object_owner();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...