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 权限,如果 PUBLIC 或其所属的其他角色仍然拥有 SELECT 权限,该用户仍可能 使用 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 命令,则该命令会像由受影响对象的拥有者发出那样执行。(由于角色没有 拥有者,在 GRANT 角色成员资格时,该命令会像由引导 超级用户发出那样执行。)由于所有权限最终都来自对象拥有者 (可能经由授予选项链间接传递),超级用户可以撤销所有权限,但如上所述, 这可能需要使用 CASCADE。
REVOKE 也可以由并非受影响对象拥有者的角色执行,只要 该角色是拥有该对象之角色的成员,或者是持有该对象上 WITH GRANT OPTION 权限之角色的成员。在这种情况下, 该命令会视同由实际拥有该对象的角色,或持有该对象上 WITH GRANT OPTION 权限的角色发出。例如,如果表 t1 由角色 g1 拥有,而角色 u1 是 g1 的成员,那么 u1 可以撤销 t1 上那些记录为由 g1 授出的权限。这包括由 u1 以及角色 g1 的其他成员作出的授权。
如果执行 REVOKE 的角色通过多条角色成员资格路径间接 持有权限,则系统不会指明将使用哪一个上层角色来执行该命令。在这种情况 下,最佳做法是使用 SET ROLE 切换成你希望作为其身份执行 REVOKE 的那个具体角色。否则,可能会撤销掉并非你本意 要撤销的权限,或者根本没有撤销任何权限。
有关具体权限类型以及如何检查对象权限的更多信息,请参见 Section 5.8。
撤销表 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。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。