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 的特权。因此,举例来说,把 SELECT 特权从 PUBLIC 回收并不一定意味着所有角色都失去了该对象上的 SELECT 特权:那些直接或者通过另一个角色被授予该特权的角色仍然拥有它。类似地,从一个用户回收 SELECT 可能无法阻止该用户使用 SELECT,如果 PUBLIC 或者另一个该用户为其成员的角色仍然拥有 SELECT 权利的话。
如果指定了 GRANT OPTION FOR,则只回收该特权的授予选项,而不是特权本身。否则,特权和授予选项都会被回收。
如果一个用户持有一个带有授予选项的特权,并且已把它授予其他用户,那么那些其他用户持有的特权就被称为依赖特权。如果第一个用户持有的特权或者授予选项正在被回收,并且存在依赖特权,那么在指定了 CASCADE 时这些依赖特权也会被回收;如果没有指定,回收操作将会失败。这种递归回收只影响那些通过一条可追溯到本 REVOKE 命令主体的用户的用户链被授予的特权。因此,如果特权也通过其他用户被授予过,受影响的用户实际上可能仍保留该特权。
当回收表上的特权时,相应的列特权(如果有)也会在该表的每一列上被自动回收。另一方面,如果一个角色被授予了表上的特权,那么从单个列回收相同的特权将不会有效果。
当回收角色中的成员身份时,GRANT OPTION 被称为 ADMIN OPTION,但行为是类似的。注意,在 PostgreSQL 16 之前的版本中,角色成员身份的授予不跟踪依赖特权,因此 CASCADE 对角色成员身份没有效果。现在情况已不再如此。还要注意,这种形式的命令不允许把噪声词 GROUP 用在 role_specification 中。
正如可以从现有的角色授予中移除 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 的那个特定角色。不这样做可能导致回收的特权不是你想要的那些,或者根本没有回收任何东西。
有关特定特权类型以及如何检查对象特权的更多信息,请参见 Section 5.8。
回收公众在表 films 上的插入特权:
REVOKE INSERT ON films FROM PUBLIC;
从用户 manuel 处回收其在视图 kinds 上的所有特权:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
注意,这实际上意味着“回收我所授予的所有特权”。
从角色 admins 中回收用户 joe 的成员身份:
REVOKE admins FROM joe;
GRANT 命令的兼容性注记以类似的方式适用于 REVOKE。按照标准,关键字 RESTRICT 或者 CASCADE 是必需的,但 PostgreSQL 默认假定 RESTRICT。