为用户授予在 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 中创建/删除索引的用户权限

如何在 postgresql 中为数据库创建用户? [关闭]

如何获得有关 YouTrack 中创建的任何新问题的通知?

返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录

在 PostgreSQL 中撤销另一个用户授予的权限

PostgreSQL 授予对表的访问权限