REVOKE — 删除访问权限
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_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 SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]role_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] whererole_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
对角色成员资格没有影响。现在不再是这样了。还要注意,此命令形式不允许在 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.8 节 以获取关于特定权限类型的更多信息,以及如何检查对象权限。
撤销表 films
REVOKE INSERT ON films FROM PUBLIC;
撤销视图 kinds
manuel
的所有权限
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
请注意,这实际上表示 “撤销我授予的所有权限”
撤销用户 joe
admins
中的成员身份
REVOKE admins FROM joe;
GRANT
命令的兼容性说明适用于 REVOKE
。根据标准,需要关键字 RESTRICT
或 CASCADE
,但 PostgreSQL 默认假定 RESTRICT
。