pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
GRANT — 定义访问权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] objectname [, ...]
TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT命令把对象(表、视图、序列)上的特定权限授予一个或多个用户或用户组。这些权限会叠加在已有权限(如果有)之上。
关键字PUBLIC表示权限将授予所有用户,包括以后可能创建的用户。可以把PUBLIC看作一个隐式定义的、始终包含所有用户的组。注意,任何特定用户所拥有的权限,是他直接被授予的权限、他被授予的当前所属各组的权限,以及授予PUBLIC的权限之和。
除对象的创建者之外的用户对对象没有任何访问权限,除非创建者授予权限。无需把权限授予对象的创建者,因为创建者自动持有所有权限。(不过,创建者也可以出于安全考虑选择撤销他自己的某些权限。注意,授予和撤销权限的能力是创建者固有的,不会丢失。删除对象的权利同样是创建者固有的,不能被授予或撤销。)
可能的权限有:
允许对指定表的任意列进行UPDATE。除SELECT权限之外,SELECT ... FOR UPDATE还需要此权限。对于序列,此权限允许使用nextval、currval和setval。
允许从指定表中DELETE行。
允许在表/视图上创建规则。(见CREATE RULE语句。)
要创建一个带外键约束的表,必须在包含被引用键的表上拥有此权限。
允许在指定表上创建触发器。(见 CREATE TRIGGER语句。)
一次性授予上述所有权限。在PostgreSQL中PRIVILEGES关键字是可选的,但严格的 SQL 要求它。
其他命令所需的权限列在各自命令的参考页上。
应当注意,数据库超级用户可以访问所有对象,而不受对象权限设置的限制。这与 Unix 系统中root的权利类似。与root一样,除非绝对必要,以超级用户身份操作是不明智的。
目前,在PostgreSQL中要只对少数几个列授予权限,必须创建一个包含所需列的视图,然后把权限授予该视图。
使用psql的\z命令获取现有对象上权限的信息:
Database = lusitania
+------------------+---------------------------------------------+
| Relation | Grant/Revoke Permissions |
+------------------+---------------------------------------------+
| mytable | {"=rw","miriam=arwdRxt","group todos=rw"} |
+------------------+---------------------------------------------+
Legend:
uname=arwR -- privileges granted to a user
group gname=arwR -- privileges granted to a group
=arwR -- privileges granted to PUBLIC
r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
arwdRxt -- ALL PRIVILEGES
REVOKE命令用于撤销访问权限。
把表 films 上的插入权限授予所有用户:
GRANT INSERT ON films TO PUBLIC;
把视图kinds上的所有权限授予用户manuel:
GRANT ALL PRIVILEGES ON kinds TO manuel;
ALL PRIVILEGES中的PRIVILEGES关键字是必需的。SQL不支持在一条命令中为多个表设置权限。
SQL92的 GRANT 语法允许为表中的单个列设置权限,也允许设置把相同权限授予他人的权限:
GRANTprivilege[, ...] ONobject[ (column[, ...] ) ] [, ...] TO { PUBLIC |username[, ...] } [ WITH GRANT OPTION ]
SQL允许为其他类型的对象授予 USAGE 权限:CHARACTER SET、COLLATION、TRANSLATION、DOMAIN。
TRIGGER 权限是在 SQL99 中引入的。RULE 权限是 PostgreSQL 扩展。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。