Postgresql角色访问交换性
我正试图弄清楚(现代)Postgresql角色之间是如何相互关联的 我有两个用户,main和foo。我希望它们的行为完全相同,foo可以访问main创建的任何内容,反之亦然。foo是main的成员 但是,main当前无权访问foo创建的表。例如,如果foo创建一个表“testfoo”,则数据库中除foo以外的任何用户(包括main)都无法访问该表。(如果main创建表,则main中的所有用户(包括foo)都具有访问权限。) 是否有任何方法更新foo或main,以便在默认情况下将访问权限授予main角色中的每个人?当前,当有人以个人用户(如foo)身份登录运行迁移时,这会导致问题,因为任何其他用户都没有访问权限Postgresql角色访问交换性,postgresql,Postgresql,我正试图弄清楚(现代)Postgresql角色之间是如何相互关联的 我有两个用户,main和foo。我希望它们的行为完全相同,foo可以访问main创建的任何内容,反之亦然。foo是main的成员 但是,main当前无权访问foo创建的表。例如,如果foo创建一个表“testfoo”,则数据库中除foo以外的任何用户(包括main)都无法访问该表。(如果main创建表,则main中的所有用户(包括foo)都具有访问权限。) 是否有任何方法更新foo或main,以便在默认情况下将访问权限授予mai
谢谢 将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语句的末尾运行。我不认为会有其他类型的语句引起的问题,但我还没有用它进行测试。这松散地基于我使用过的其他一些代码,但它只关注表。所以,我想是的,但我从未尝试过。