Postgresql角色访问交换性

时间:2018-05-02 18:21:58

标签: postgresql

我试图弄清楚(现代)Postgresql角色如何相互关联。

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

但是,main目前无法访问foo创建的表。例如,如果foo创建了一个表' testfoo',则数据库中除foo以外的任何用户(包括main)都无法访问它。 (如果main创建了一个表,main中的所有用户(包括foo)都可以访问。)

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

如果您希望主要人员可以访问由foo创建的所有表,您可以尝试:

ALTER DEFAULT PRIVILEGES FOR ROLE foo IN SCHEMA public
GRANT SELECT ON TABLES TO main;

但是您必须为角色main的每个成员执行此操作,并且仍然不会将个人用户的所有权更改为该组。

我认为触发create语句并将表的所有权从创建角色更改为主角色的事件触发器可以正常工作。

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

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;