Postgresql角色访问交换性

Postgresql角色访问交换性,postgresql,Postgresql,我正试图弄清楚(现代)Postgresql角色之间是如何相互关联的 我有两个用户,main和foo。我希望它们的行为完全相同,foo可以访问main创建的任何内容,反之亦然。foo是main的成员 但是,main当前无权访问foo创建的表。例如,如果foo创建一个表“testfoo”,则数据库中除foo以外的任何用户(包括main)都无法访问该表。(如果main创建表,则main中的所有用户(包括foo)都具有访问权限。) 是否有任何方法更新foo或main,以便在默认情况下将访问权限授予mai

我正试图弄清楚(现代)Postgresql角色之间是如何相互关联的

我有两个用户,main和foo。我希望它们的行为完全相同,foo可以访问main创建的任何内容,反之亦然。foo是main的成员

但是,main当前无权访问foo创建的表。例如,如果foo创建一个表“testfoo”,则数据库中除foo以外的任何用户(包括main)都无法访问该表。(如果main创建表,则main中的所有用户(包括foo)都具有访问权限。)

是否有任何方法更新foo或main,以便在默认情况下将访问权限授予main角色中的每个人?当前,当有人以个人用户(如foo)身份登录运行迁移时,这会导致问题,因为任何其他用户都没有访问权限


谢谢

将main授予foo并不将foo授予main。赠款是一种方式

如果您希望foo创建的所有表都能被任何人访问,您可以尝试:

ALTER DEFAULT PRIVILEGES FOR ROLE foo IN SCHEMA public
GRANT SELECT ON TABLES TO main;
但是您必须为角色
main
的每个成员执行此操作,并且这仍然不会将所有权从个人用户更改为组

我认为触发create语句并将表的所有权从creating角色更改为main角色的事件触发器可以工作

下面是一些可能适合您的代码。我还没有测试过

BEGIN;

CREATE OR REPLACE FUNCTION change_ownership()
RETURNS event_trigger
LANGUAGE plpgsql

AS $$

DECLARE
    obj record;

    BEGIN

    /* There might be multiple DDL commands.  Check each one to see if it
    creates a table and change the permisions and ownership of the table to
    the main role. */

    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
    LOOP

    IF obj.object_type = 'table'
       AND tg_tag IN ('CREATE TABLE',
                      'CREATE TABLE AS')
    THEN

        RAISE NOTICE 'Table % created with % statement.',
                     obj.object_identity,
                     tg_tag;

        EXECUTE format('ALTER TABLE %I.%I OWNER TO main;',
                       obj.SCHEMA_NAME,
                       SUBSTRING(obj.object_identity FROM '[^.]*$'));

    END IF;
    END LOOP;
END $$;

CREATE EVENT TRIGGER table_creation_trigger
ON ddl_command_end
EXECUTE PROCEDURE change_ownership();

COMMIT;

谢谢-假设我不只是希望它用于表(例如,序列、视图),那么仅仅删除IF条件并调用“reassignowneby”会有问题吗?或者你认为这会造成其他问题吗?@terry87我不太清楚。代码在每个DDL语句的末尾运行。我不认为会有其他类型的语句引起的问题,但我还没有用它进行测试。这松散地基于我使用过的其他一些代码,但它只关注表。所以,我想是的,但我从未尝试过。