授予对 PostgreSQL 中未来表的权限?

Posted

技术标签:

【中文标题】授予对 PostgreSQL 中未来表的权限?【英文标题】:Grant privileges on future tables in PostgreSQL? 【发布时间】:2014-05-06 05:28:28 【问题描述】:

我正在运行 PostgreSQL 9.3.1。我有test 数据库和backup 用于备份数据库的用户。我对所有当前表授予权限没有问题,但是每次将新表添加到架构时我都必须授予权限。

createdb test

psql test
test=# create table foo();
CREATE TABLE
test=# grant all on all tables in schema public to backup;
GRANT
test=# create table bar();
CREATE TABLE

psql -U backup test
test=> select * from foo;
test=> select * from bar;
ERROR:  permission denied for relation bar

是否可以在不使用户成为表的所有者的情况下授予对将来创建的表的访问权限?

【问题讨论】:

【参考方案1】:

看起来解决方案是更改 backup 用户的默认权限:

alter default privileges in schema public grant all on tables to backup;
alter default privileges in schema public grant all on sequences to backup;

来自 Matt Schaffer 的评论:

需要注意的是,默认设置仅适用于执行 alter 声明。这让我很困惑,因为我大部分时间都在开车 来自 postgres 用户的权限语句,但从创建表 应用程序用户。简而言之,您可能需要这样的东西,具体取决于 你的设置:

ALTER DEFAULT PRIVILEGES FOR USER webapp IN SCHEMA public GRANT SELECT ON SEQUENCES TO backup;
ALTER DEFAULT PRIVILEGES FOR USER webapp IN SCHEMA public GRANT SELECT ON TABLES TO backup;

【讨论】:

相关文档:postgresql.org/docs/9.0/static/sql-alterdefaultprivileges.html 作为警告,默认值仅适用于执行 alter 语句的用户。这让我很困惑,因为我是从 postgres 用户驱动我的大部分权限声明,但从应用程序用户创建表。简而言之,根据您的设置,您可能需要这样的东西:ALTER DEFAULT PRIVILEGES FOR USER webapp IN SCHEMA public GRANT SELECT ON SEQUENCES TO backup; ALTER DEFAULT PRIVILEGES FOR USER webapp IN SCHEMA public GRANT SELECT ON TABLES TO backup; 如何记录更改默认权限的限制让我感到困惑。如果备份不是拥有表的角色的成员,我是否正确,这个答案实际上不起作用?当我尝试 alter default privileges in schema public grant SELECT on tables to backup 时,它对我不起作用,当我的备份用户不是所有者或超级用户并且没有其他权限时。 我有一个超级用户和一个只读用户。当我添加一个新表然后尝试从只读表中选择时,这对我不起作用。每次添加表时,我都必须重新运行 GRANT SELECT ON... 语句。 @danny 不,如果更改语句作为创建表的用户/角色执行,则答案只能按原样工作。这意味着如果它们由 - 比如说 - juser 执行并且只有 juser 创建新表,那么一切正常。如果其他用户(例如用户 postgres)在该数据库/模式中创建表,则这些默认值不会应用于这些表。【参考方案2】:

如果您希望备份用户能够访问用户N未来表, 您必须在每个创建新表的用户N 下运行以下代码, 因为 ALTER DEFAULT PRIVILEGES... 仅适用于您在其下运行的用户 ALTER DEFAULT PRIVILEGES...

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO backup;

【讨论】:

@Andrey Chernih's answer from eight years ago 已经提出了确切的更改。

以上是关于授予对 PostgreSQL 中未来表的权限?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 授予对表的访问权限

PostgreSQL 8.4 将所有表的 DML 权限授予一个角色

授予数据库中的所有权限有啥作用?

为用户授予在 postgresql 中创建的任何新表的权限

Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限

授予 PostgreSQL 中特定数据库的权限