本文介绍了REVOKE的语法、说明以及示例等内容。
语法
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
FROM role_specification [, ...]
[ 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 SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ ADMIN OPTION FOR ]
role_name [, ...] FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER
简介
REVOKE
命令收回之前从一个或者更多角色授予的特权。关键词PUBLIC
隐式定义的全部角色的组。
特权类型的含义见GRANT命令的描述。
注意任何特定角色拥有的特权包括直接授予给它的特权、从它作为其成员的角色中得到的特权以及授予给PUBLIC
的特权。因此, 从PUBLIC
收回SELECT
特权并不一定会意味着所有角色都会失去在该对象上的SELECT
特权:那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回SELECT
后,如果PUBLIC
或者另一个成员关系角色仍有SELECT
权利,该用户还是可以使用 SELECT
。
如果指定了GRANT OPTION FOR
,只会回收该特权的授予选项,特权本身不被回收。否则,特权及其授予选项都会被回收。
如果一个用户持有一个带有授予选项的特权并且把它授予给了其他用户, 那么被那些其他用户持有的该特权被称为依赖特权。如果第一个用户持有的该特权或者授予选项正在被收回且存在依赖特权,指定 CASCADE
可以连带回收那些依赖特权,不指定则会导致回收动作失败。这种递归回收只影响通过可追溯到该 REVOKE
命令的主体的用户链授予的特权。因此, 如果该特权经由其他用户授予给受影响用户,受影响用户可能实际上还保留有该特权。
在回收一个表上的特权时,也会在该表的每一个列上自动回收对应的列特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的特权,那么从个别的列上回收同一个特权将不会生效。
在回收一个角色中的成员关系时,GRANT OPTION
被改称为ADMIN OPTION
,但行为是类似的。这种形式的命令也允许使用 GRANTED BY
选项,但该选项当前被忽略(除了检查指定角色的存在)。也要注意这种形式的命令不允许在 role_specification
中使用噪声词GROUP
。
说明
用户只能回收由它直接授出的特权。例如,如果用户 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;