On this page
REVOKE
撤消—删除访问权限
Synopsis
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 function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL FUNCTIONS 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
Description
REVOKE
命令撤消一个或多个角色先前授予的特权。关键字PUBLIC
表示所有角色的隐式定义组。
有关特权类型的含义,请参见GRANT命令的描述。
请注意,任何特定角色都将具有直接授予它的特权,已授予其当前成员的任何角色的特权以及授予PUBLIC
的特权的总和。因此,例如,从PUBLIC
撤消SELECT
特权并不一定意味着所有角色都失去了对该对象的SELECT
特权:直接或通过其他角色授予该特权的人仍将拥有它。同样,如果PUBLIC
或另一个成员角色仍然具有SELECT
权限,则从用户撤消SELECT
可能不会阻止该用户使用SELECT
。
如果指定了GRANT OPTION FOR
,则仅撤销特权的授予选项,而不撤销特权本身。否则,特权和授予选项都将被吊销。
如果一个用户拥有带有授予选项的特权并将其授予其他用户,则这些其他用户所拥有的特权称为从属特权。如果第一个用户拥有的特权或授予选项被吊销并且存在从属特权,则如果指定了CASCADE
,那些从属特权也将被吊销;否则,这些从属特权也将被吊销。如果不是,则撤销操作将失败。此递归吊销仅影响通过用户链授予的特权,这些特权可 traceback 到此REVOKE
命令主题的用户。因此,如果还通过其他用户授予了特权,则受影响的用户可能会有效保留该特权。
撤消表的特权时,表的每一列也会自动撤消相应的列特权(如果有)。另一方面,如果已向角色授予表特权,则从各个列撤消相同特权将无效。
撤消角色成员身份时,GRANT OPTION
称为ADMIN OPTION
,但行为类似。这种形式的命令还允许使用GRANTED BY
选项,但是该选项当前被忽略(除了检查命名角色的存在以外)。还要注意,这种形式的命令不允许* role_specification
*中的噪声字GROUP
。
Notes
使用psql的\dp
命令显示在现有表和列上授予的特权。有关格式的信息,请参见GRANT。对于非表对象,还有其他\d
命令可以显示其特权。
用户只能撤消该用户直接授予的特权。例如,如果用户 A 已向用户 B 授予了具有授予选项的特权,而用户 B 又将其授予了用户 C,则用户 A 无法直接从 C 撤消该特权。相反,用户 A 可以撤消授予选项。例如,如果 A 和 B 都向 C 授予了相同的特权,则 A 可以撤消他们自己的授予,但 B 不能授予 B 的授予,因此 C 仍将有效地享有特权。
当对象的非所有者尝试对该对象具有REVOKE
特权时,如果用户对该对象没有任何特权,该命令将完全失败。只要有某些特权,该命令就会 continue 执行,但是只会撤消用户具有授予选项的那些特权。如果未保留任何授予选项,则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
的特定角色。否则,可能会导致吊销您想要的特权以外的特权,或者根本不撤销任何特权。
Examples
撤消表films
上公众的插入权限:
REVOKE INSERT ON films FROM PUBLIC;
在视图kinds
上撤消用户manuel
的所有特权:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
请注意,这实际上意味着“撤销我授予的所有特权”。
撤消用户joe
中角色admins
的成员身份:
REVOKE admins FROM joe;
Compatibility
GRANT命令的兼容性说明类似地适用于REVOKE
。根据标准,关键字RESTRICT
或CASCADE
是必需的,但是 PostgreSQL 默认采用RESTRICT
。