REVOKE
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 [, ...]
[ GRANTED BY 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 [, ...]
[ GRANTED BY 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 [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY 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 [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }
ON PARAMETER configuration_parameter [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]
role_name [, ...] FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER
描述
REVOKE
命令撤销先前授予一个或多个角色的权限。关键字PUBLIC
指的是所有角色的隐式定义组。
有关权限类型的含义,请参阅GRANT
命令的说明。
请注意,任何特定角色都将拥有直接授予它的权限、授予其当前所属的任何角色的权限以及授予PUBLIC
的权限的总和。因此,例如,从PUBLIC
撤销SELECT
权限并不一定意味着所有角色都失去了对该对象的SELECT
权限:直接授予或通过其他角色授予权限的角色仍将拥有该权限。同样,从用户撤销SELECT
可能无法阻止该用户使用SELECT
,如果PUBLIC
或其他成员角色仍具有SELECT
权限。
如果指定了GRANT OPTION FOR
,则只会撤销该权限的授予选项,而不会撤销权限本身。否则,权限和授予选项都将被撤销。
如果用户拥有具有授予选项的权限并已将其授予其他用户,则这些其他用户持有的权限称为依赖权限。如果正在撤销第一个用户持有的权限或授予选项并且存在依赖权限,则如果指定了CASCADE
,这些依赖权限也将被撤销;如果没有指定,撤销操作将失败。此递归撤销仅影响通过可追溯到此REVOKE
命令主体的用户的用户链授予的权限。因此,如果权限也通过其他用户授予,则受影响的用户可能有效地保留该权限。
在撤销表上的权限时,也会自动撤销表中每列的相应列权限(如果有)。另一方面,如果已向角色授予表上的权限,则从各个列撤销相同的权限将不起作用。
在撤销角色成员资格时,GRANT OPTION
称为ADMIN OPTION
,但行为类似。请注意,在PostgreSQL16 之前的版本中,不会跟踪角色成员资格授予的依赖权限,因此CASCADE
对角色成员资格没有影响。现在不再是这样了。另请注意,此命令的此形式不允许在*role_specification
*中使用噪音词GROUP
。
就像可以从现有角色授权中移除ADMIN OPTION
一样,也可以撤销INHERIT OPTION
或SET OPTION
。这相当于将相应选项的值设置为FALSE
。
备注
用户只能撤销由该用户直接授予的权限。例如,如果用户 A 已向用户 B 授予了具有授予选项的权限,而用户 B 又将其授予了用户 C,那么用户 A 无法直接从 C 处撤销权限。相反,用户 A 可以从用户 B 处撤销授予选项,并使用CASCADE
选项,以便依次从用户 C 处撤销权限。另一个示例,如果 A 和 B 都向 C 授予了相同的权限,则 A 可以撤销自己的授予,但不能撤销 B 的授予,因此 C 仍然有效地拥有该权限。
当对象非所有者尝试对对象REVOKE
权限时,如果用户对该对象没有任何权限,则该命令将直接失败。只要有一些权限可用,该命令将继续执行,但它只会撤销用户拥有授予选项的那些权限。如果未持有任何授予选项,则REVOKE ALL PRIVILEGES
表单将发出警告消息,而其他表单将在命令中明确命名的任何权限的授予选项未被持有时发出警告。(原则上,这些声明也适用于对象所有者,但由于所有者始终被视为持有所有授予选项,因此永远不会出现这种情况。)
如果超级用户选择发出GRANT
或REVOKE
命令,则该命令将执行,就像它是由受影响对象的拥有者发出的。(由于角色没有所有者,在GRANT
角色成员身份的情况下,该命令将执行,就像它是由引导超级用户发出的。)由于所有权限最终都来自对象所有者(可能通过授予选项链间接),因此超级用户可以撤销所有权限,但这可能需要使用如上所述的CASCADE
。
REVOKE
还可以由一个角色来执行,该角色不是受影响对象的拥有者,但属于拥有该对象的某个角色,或者属于对该对象拥有WITH GRANT OPTION
权限的某个角色。在这种情况下,该命令的执行方式如同由实际拥有该对象或拥有WITH GRANT OPTION
权限的包含角色发出的一样。例如,如果表t1
由角色g1
拥有,而角色u1
是该角色的成员,那么u1
可以撤销t1
上由g1
授予的权限。这将包括由u1
以及角色g1
的其他成员授予的权限。
如果执行REVOKE
的角色通过多个角色成员身份路径间接拥有权限,则将使用哪个包含角色来执行该命令是未指定的。在这种情况下,最佳做法是使用SET ROLE
成为您希望以其身份执行REVOKE
的特定角色。如果不这样做,可能会撤销您本不打算撤销的权限,或者根本不撤销任何权限。
请参阅第 5.7 节,以了解有关特定权限类型的更多信息,以及如何检查对象的权限。
示例
撤销公有用户对表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
。