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

82

我正在运行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

是否可以在不将用户设为表的拥有者的情况下授予其访问以后创建的表的权限?

3个回答

92

看起来解决方法是修改 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;

其中webapp表示未来创建新表的用户,而backup是可以读取由webapp创建的新表的用户。


1
相关文档:http://www.postgresql.org/docs/9.0/static/sql-alterdefaultprivileges.html - aaaaaa
34
需要注意的是,缺省值只适用于执行alter语句的用户。这让我感到困惑,因为我大部分权限语句都是从postgres用户衍生的,但是我又需要用app用户创建表。简而言之,根据你的设置,你可能需要像这样做:`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;` - Mat Schaffer
9
我觉得改变默认权限的限制是很困惑的。如果备份用户不是表拥有者角色的成员,那么这个答案是否不起作用?当我尝试使用“alter default privileges in schema public grant SELECT on tables to backup”命令时,我的备份用户既不是owner也不是超级用户,并且没有其他的权限时,它不起作用。 - danny
4
@danny,仅当执行更改语句的用户/角色创建表时,该答案才能按原样工作。这意味着如果它们由 - 比如说 - juser 执行,并且只有 juser 创建新表,则一切都很正常。但如果其他用户(例如用户postgres)在该数据库/模式中创建表,则这些默认值不会应用于这些表。 - maxschlepzig
1
我有1.adminuser,2.tableuser,3.readuser。我需要写什么样的高级代码行才能让adminuser授予权限,从tableuser创建表,并在readuser上设置只读权限? - Esqarrouth
显示剩余3条评论

1
如果您希望“备份”用户能够访问用户N的未来表格,您必须在每个创建新表格的用户N下运行以下代码,因为ALTER DEFAULT PRIVILEGES...仅适用于由您运行ALTER DEFAULT PRIVILEGES...的用户创建的对象。
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO backup;

3
@Andrey Chernih八年前的回答已经提出了确切的变化建议。 - Jeremy Caney
1
为了准确性,@JeremyCaney,我注意到Denis提出的“精确更改”仅在2年前添加,而不是原始问题的8年,来自Mat Schaffer的评论,尽管仍比Denis的答案旧,但并非8年。 - NeilG
2
@JeremyCaney 从那个答案中,我不清楚您是否必须在创建表的用户下运行代码,还是在postgres下但使用“FOR USER”子句。Denis的回答帮助我更好地理解了它。 - lukfi

0
我正在尝试创建一个角色,授予连接访问权限,并修改默认特权以保留对未来对象的访问权限。然而,似乎以下命令在角色级别上不起作用。 alter default privileges in schema public grant all on tables to backup;
我遵循了下面的文档,但似乎有两个命令对于角色不起作用。 DOC: https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/ 第一个命令: GRANT CONNECT ON DATABASE mydatabase TO readonly; 第二个命令: GRANT USAGE ON SCHEMA myschema TO readonly; (对于ROLES通常需要TO ROLE,我也尝试了TO ROLE,但仍然不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接