我试图将给定数据库的所有表上的所有特权授予新的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)向用户授予所有表上的所有权限的正确方法是什么? (包括将来创建的所有表)

#1 楼

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


GRANT ALL PRIVILEGES ON DATABASE向角色授予数据库对角色的CREATECONNECTTEMPORARY特权(用户被正确称为角色) 。实际上,这些特权均不允许角色从表中读取数据;为此,需要在表上具有SELECT特权。

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

PostgreSQL 9.0引入了以下内容几乎是您想要的语法:

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

麻烦的是,如果您在默认的“公共”模式之外的模式中创建表,则此GRANT不适用于他们。如果您确实使用非公开模式,则必须分别对这些模式进行特权。



评论


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

– rz。
2010年11月4日在6:31

不,我不认为一个数据库可以有一个以上的所有者,但是您可以给他们所有所有者的所有写内容

– hellomynameisjoel
2010年11月4日在7:09

别忘了您必须对序列进行相同的操作:将SCHEMA中所有序列上的所有特权授予public给your_user;否则您将无法插入任何记录。

–user179328
13年7月6日在2:10



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

– Kaustubh
2015年2月26日在6:16

#2 楼

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


创建“ nologin”角色以充当数据库所有者:create role dbowner nologin

更改您数据库的所有者:alter database mydb owner dbowner

将您的所有登录信息授予此新角色:grant dbowner to user1, user2


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

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

评论


克里斯·科格登(Chris Cogdon),只是一个小小的修正:将数据库mydb所有者更改为dbowner

–阿德姆琴科
19年1月14日23:06