REVOKE — 移除访问特权
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }function_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ]role_name
[, ...] FROMrole_name
[, ...] [ CASCADE | RESTRICT ]
REVOKE
命令收回之前从一个或者更多角色
授予的特权。关键词PUBLIC
隐式定义的全部角色的组。
特权类型的含义见GRANT命令的描述。
注意任何特定角色拥有的特权包括直接授予给它的特权、从它作为其成员的
角色中得到的特权以及授予给PUBLIC
的特权。因此,
从PUBLIC
收回SELECT
特权并不一定会意味
着所有角色都会失去在该对象上的SELECT
特权:那些直接被授
予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户
收回SELECT
后,如果PUBLIC
或者另一个
成员关系角色仍有SELECT
权利,该用户还是可以使用
SELECT
。
如果指定了GRANT OPTION FOR
,只会回收该特权
的授予选项,特权本身不被回收。否则,特权及其授予选项都会被回收。
如果一个用户持有一个带有授予选项的特权并且把它授予给了其他用户,
那么被那些其他用户持有的该特权被称为依赖特权。如果第一个用户持有
的该特权或者授予选项正在被收回且存在依赖特权,指定
CASCADE
可以连带回收那些依赖特权,不指定则会
导致回收动作失败。这种递归回收只影响通过可追溯到该
REVOKE
命令的主体的用户链授予的特权。因此,
如果该特权经由其他用户授予给受影响用户,受影响用户可能实际上还
保留有该特权。
在回收一个表上的特权时,也会在该表的每一个列上自动回收对应的列 特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的 特权,那么从个别的列上回收同一个特权将不会生效。
在回收一个角色中的成员关系时,GRANT OPTION
被改
称为ADMIN OPTION
,但行为是类似的。也要注意这种
形式的命令不允许噪声词GROUP
。
使用psql的\dp
命令能够显示在现有表和列上已被授予的特权。其格式可见GRANT。对于不是表的对象有其他\d
命令可以显示它们的特权。
用户只能回收由它直接授出的特权。例如,如果用户 A 已经把一个带有
授予选项的特权授予给了用户 B,并且用户 B 接着把它授予给了用户 C,
那么用户 A 无法直接从 C 收回该特权。反而,用户 A 可以从用户 B 收回
该授予选项并且使用CASCADE
选项,这样该特权会被
依次从用户 C 回收。对于另一个例子,如果 A 和 B 都把同一个特权授予
给了 C,A 能够收回它们自己的授权但不能收回 B 的授权,因此 C 实际上
仍将拥有该特权。
当一个对象的非拥有者尝试REVOKE
该对象上的特权时,
如果该用户在该对象上什么特权都不拥有,该命令会立刻失败。只要有某个
特权可用,该命令将继续,但是它只会收回那些它具有授予选项的特权。
如果没有持有授予选项,REVOKE ALL PRIVILEGES
形式
将发出一个警告,而其他形式在没有持有该命令中特别提到的任何特权的
授予选项时就会发出警告(原则上,这些语句也适用于对象拥有者,但是
由于拥有者总是被认为持有所有授予选项,这些情况永远不会发生)。
如果一个超级用户选择发出一个GRANT
或者
REVOKE
命令,该命令就好像被受影响对象的拥有者发出
的一样被执行。因为所有特权最终来自于对象拥有者(可能是间接地通过
授予选项链),可以由超级用户收回所有特权,但是这可能需要前述的
CASCADE
。
REVOKE
也可以由一个并非受影响对象的拥有者的角色
完成,但是该角色应该是一个拥有该对象的角色的成员或者是一个在该对象
上拥有特权的WITH GRANT OPTION
的角色的成员。
在这种情况中,该命令就好像被实际拥有该对象或者特权的
WITH GRANT OPTION
的包含角色发出的一样被执行。
例如,如果表t1
被角色g1
拥有,而u1
是g1
的一个成员,那么u1
能收回t1
上被记录为由g1
授出的特权。这会包括由u1
以及由角色g1
的其他成员完成的授予。
如果执行REVOKE
的角色持有通过多于一条角色成员
关系路径间接得到的特权,其中哪一条包含将被用于执行该命令的
角色是没有被指明的。在这种情况中,最好使用
SET ROLE
成为你想作为其身份执行
REVOKE
的特定角色。如果无法做到这一点
可能会导致回收超过你预期的特权,或者根本回收不了任何东西。
从 public 收回表films
上的插入特权:
REVOKE INSERT ON films FROM PUBLIC;
从用户manuel
收回视图
kinds
上的所有特权:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
注意着实际意味着“收回所有我授出的特权”。
从用户joe
收回角色admins
中的成员关系:
REVOKE admins FROM joe;
GRANT命令的兼容性注解同样适用于
REVOKE
。根据标准,关键词
RESTRICT
或CASCADE
是必要的,但是PostgreSQL默认假定为
RESTRICT
。