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
的权限。因此,例如,从 PUBLIC
撤销 SELECT
权限并不一定意味着所有角色都失去了对该对象的 SELECT
权限:那些直接授予或通过另一个角色授予的角色仍然拥有该权限。同样,如果 PUBLIC
或其他成员角色仍然具有 SELECT
权限,则从用户撤销 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
是其成员,则 u1
可以撤销记录为 g1
授予的 t1
上的权限。这将包括 u1
以及角色 g1
的其他成员所做的授予。
如果执行 REVOKE
的角色通过多个角色成员资格路径间接持有权限,则不指定使用哪个包含角色来执行该命令。在这种情况下,最佳实践是使用 SET ROLE
来成为您要执行 REVOKE
的特定角色。否则可能会导致撤销您不打算撤销的权限,或者根本不撤销任何权限。
有关特定权限类型以及如何检查对象的权限的更多信息,请参阅第 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
。
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。