为用户授予在 postgresql 中创建的任何新表的权限
Posted
技术标签:
【中文标题】为用户授予在 postgresql 中创建的任何新表的权限【英文标题】:Grant permissions to user for any new tables created in postgresql 【发布时间】:2013-10-19 00:27:09 【问题描述】:目前我正在使用它来授予权限:
grant select on all tables in schema public to <user_name>;
alter default privileges in schema public grant select on tables to <user_name>;
根据documentation,第二条语句应该已经解决了问题。但是,当将新表添加到公共架构时,它不会自动授予 user_name 权限。
我正在使用此用户 (user_name) 将数据复制到另一个数据库。
【问题讨论】:
你可能想看看How to GRANT SELECT by default to B, on tables created by A?:this solution 也使用默认权限解决了它。 【参考方案1】:找到了答案。就在the ALTER DEFAULT PRIVILEGES documentation的这一行。
您只能更改将由您自己或您所属的角色创建的对象的默认权限。
我使用了不同于创建表的用户的更改默认权限。
确保在alter default privilege
语句之前将角色设置为创建表的用户:
SET ROLE <user_that_creates_new_tables>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <user_name>;
【讨论】:
由于这是目前最受好评的答案,leon de vries's answer 最适用于 postgresql 版本 >= 9.0【参考方案2】:要授予默认权限,您需要授予创建表的用户。
您将表创建为SA_user
,但将表读取为READ_user
。您的代码需要如下所示:
ALTER DEFAULT PRIVILEGES
FOR USER SA_user
IN SCHEMA schema_name
GRANT SELECT ON TABLES TO READ_user;
因此,每当SA_user
创建表时,它都会授予READ_user
的选择权限。
【讨论】:
【参考方案3】:我一直在寻找同样的东西,我找到了解决这个问题的其他方法。基于 postgresql 文档我们可以创建事件触发器,所以当创建新表时,授权查询将自动执行。因此,无论谁创建了新表,其他用户都允许使用它。
CREATE OR REPLACE FUNCTION auto_grant_func()
RETURNS event_trigger AS $$
BEGIN
grant all on all tables in schema public to <username>;
grant all on all sequences in schema public to <username>;
grant select on all tables in schema public to <username>;
grant select on all sequences in schema public to <username>;
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER auto_grant_trigger
ON ddl_command_end
WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS')
EXECUTE PROCEDURE auto_grant_func();
【讨论】:
没做过postgres,为什么没有执行功能? @WhatsThePoint,对不起,我不明白,你能解释一下你的问题吗? 在底部你已经执行了程序,为什么它不起作用? @WhatsThePoint:@WhatsThePoint:EXECUTE PROCEDURE
在这种情况下是一种误导性的语法怪异,受模糊 SQL 标准的启发,最终在 Postgres 11 中得到修复。请参阅:dba.stackexchange.com/a/255319/3684以上是关于为用户授予在 postgresql 中创建的任何新表的权限的主要内容,如果未能解决你的问题,请参考以下文章
如何在 postgresql 中为数据库创建用户? [关闭]