Postgresql:授予数据库上的所有特权有什么作用?


60

我试图将给定数据库的所有表上的所有特权授予新的postgres用户(而不是所有者)。似乎GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;没有做到这一点。成功运行上述命令后(以postgres用户身份),我以new_user身份获得以下内容:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

两个问题:

1)如果不授予my_db上所有表的所有权限,那么上面的命令会做什么?

2)向用户授予对所有表的所有权限的正确方法是什么?(包括将来创建的所有表)

Answers:


80

您的问题的答案来自在线PostgreSQL 8.4文档

  1. GRANT ALL PRIVILEGES ON DATABASE授予CREATECONNECT以及TEMPORARY一个数据库,一个角色的特权(用户适当地称为角色)。这些特权实际上都不允许角色从表中读取数据;实际上,这些特权都不允许角色从表中读取数据。SELECT为此,需要表上的特权。

  2. 我不确定是否有“适当的”方法可以将角色对所有表的所有特权授予。确保给定角色在表上具有所有特权的最佳方法是确保角色拥有表。默认情况下,每个新创建的对象均由创建它的角色所拥有,因此,如果您希望角色在表上拥有所有特权,请使用该角色来创建它。

    PostgreSQL 9.0引入了几乎所需的以下语法:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    麻烦之处在于,如果您在默认的“公共”架构之外的架构中创建表,则这GRANT不适用于它们。如果确实使用非公共模式,则必须分别拥有GRANT这些模式的特权。


1
一个数据库可以有多个所有者吗?如果是这样,如何添加其他所有者?
rz。

不,我不认为一个数据库可以拥有一个以上的所有者,但是您可以给他们所有所有者的
书面记录

15
不要忘记您必须对序列进行相同的操作:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;否则您就不能插入任何记录。

即使不起作用,也可以尝试以下方法:==将SCHEMA中所有表上的所有特权授予public to your_user;
Kaustubh 2015年

10

可以设置多个登录名来充当数据库所有者:

  • 创建一个“ nologin”角色以充当所有者: create role dbowner nologin
  • 将数据库的所有者更改为此: alter database mydb owner dbowner
  • 将您的所有登录授予该新角色: grant dbowner to user1, user2

现在,如果user1或user2登录,则它们具有对“ mydb”的所有权限,而无需任何进一步的授予。

但是,我会仔细考虑此解决方案。诱使您的Web应用程序使用这些登录名之一来避免在架构更新时创建额外授权的麻烦,但是您正在以这种方式删除一种非常有用的保护形式。如果您确实确实需要多个“管理员”,请使用上述解决方案,但请坚持使用“为模式中的所有表授予所有权限...”模式,以供“正常使用”应用程序登录。


1
克里斯·科格登(Chris Cogdon),只是一个小小的解决方案:将数据库mydb所有者更改 dbowner
user876743
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.