REVOKE — 移除访问权限
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
[, ...] | 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,但行为相似。请注意,在 PostgreSQL 16 之前的版本中,角色成员授予的依赖权限未被跟踪,因此 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 命令,则该命令将执行,就好像是由受影响对象的所有者发出的。(由于角色没有所有者,在授予角色成员资格的情况下,命令将执行,就好像是由引导超级用户发出的。)由于所有权限最终来自对象所有者(可能通过授予选项链间接获得),因此超级用户可以撤销所有权限,但这可能需要使用 CASCADE,如上所述。
REVOKE 也可以由一个不是受影响对象所有者的角色执行,但该角色是拥有该对象的角色的成员,或者是一个拥有该对象 WITH GRANT OPTION 权限的角色的成员。在这种情况下,命令将执行,就好像是由实际拥有对象或拥有 WITH GRANT OPTION 权限的包含角色发出的。例如,如果表 t1 由角色 g1 拥有,而角色 u1 是 g1 的成员,那么 u1 可以撤销在 t1 上被记录为由 g1 授予的权限。这包括 u1 以及 g1 的其他成员所做的授予。
如果执行 REVOKE 的角色通过多个角色成员身份路径间接持有权限,则不确定将使用哪个包含角色来执行命令。在这种情况下,最佳实践是使用 SET ROLE 来成为你想要执行 REVOKE 的特定角色。未能这样做可能导致撤销了非预期的权限,或者根本没有撤销任何权限。
有关特定权限类型以及如何检查对象权限的更多信息,请参见 第 5.8 节。
撤销 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。