2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

REVOKE

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 的权限的总和。因此,例如,撤销 PUBLICSELECT 权限并不一定意味着所有角色都已失去对该对象的 SELECT 权限:那些直接或通过另一个角色获得该权限的角色仍将拥有该权限。同样,撤销用户的 SELECT 权限可能不会阻止该用户使用 SELECT,如果 PUBLIC 或另一个成员角色仍然拥有 SELECT 权限。

如果指定了 GRANT OPTION FOR,则仅撤销该权限的授予选项,而不是权限本身。否则,将撤销权限和授予选项。

如果一个用户拥有带授予选项的权限并已将其授予其他用户,则这些其他用户持有的权限称为依赖权限。如果正在撤销第一个用户持有的权限或授予选项,并且存在依赖权限,则如果指定了 CASCADE,则这些依赖权限也将被撤销;如果没有指定,则撤销操作将失败。此递归撤销仅影响通过用户链追溯到此 REVOKE 命令主题用户的权限。因此,如果权限也通过其他用户授予,则受影响的用户可能会有效地保留该权限。

撤销表上的权限时,相应的列权限(如果有)也会自动从表的每一列上撤销。另一方面,如果某个角色已授予表上的权限,则撤销各个列上的相同权限将不会产生任何影响。

撤销角色的成员资格时,GRANT OPTION 将称为 ADMIN OPTION,但行为类似。请注意,在 PostgreSQL 16 之前的版本中,不会跟踪角色成员资格授予的依赖权限,因此 CASCADE 对角色成员资格无效。这种情况已不再存在。另请注意,此表单的命令不允许在role_specification 中使用噪声词 GROUP

就像可以从现有的角色授予中删除 ADMIN OPTION 一样,也可以撤销 INHERIT OPTIONSET OPTION。这等效于将相应选项的值设置为 FALSE

注释

用户只能撤销其直接授予的权限。例如,如果用户 A 已将带授予选项的权限授予用户 B,而用户 B 又将其授予用户 C,则用户 A 无法直接从 C 撤销该权限。相反,用户 A 可以从用户 B 撤销授予选项,并使用 CASCADE 选项,以便依次从用户 C 撤销该权限。再举一个例子,如果 A 和 B 都已将相同权限授予 C,则 A 可以撤销自己的授予,但不能撤销 B 的授予,因此 C 仍将有效地拥有该权限。

当对象的所有者以外的用户尝试对对象 REVOKE 权限时,如果用户对该对象没有任何权限,则该命令将直接失败。只要有某种权限可用,该命令就会继续执行,但它只会撤销用户拥有授予选项的那些权限。如果未持有任何授予选项,则 REVOKE ALL PRIVILEGES 形式将发出警告消息,而其他形式如果未持有命令中专门指定的任何权限的授予选项,则将发出警告。(原则上,这些语句也适用于对象所有者,但由于所有者始终被视为持有所有授予选项,因此这些情况永远不会发生。)

如果超级用户选择发出 GRANTREVOKE 命令,则该命令将被视为由受影响对象的所有者发出。(由于角色没有所有者,因此在授予角色成员资格的情况下,该命令将被视为由引导超级用户发出。)由于所有权限最终都来自对象所有者(可能是通过授予选项链间接获得),因此超级用户可以撤销所有权限,但这可能需要如上所述使用 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;

请注意,这实际上意味着“撤销我授予的所有权限”。

撤销用户 joeadmins 角色的成员资格

REVOKE admins FROM joe;

兼容性

GRANT 命令的兼容性说明也适用于 REVOKE。根据标准,需要关键字 RESTRICTCASCADE,但 PostgreSQL 默认情况下假定为 RESTRICT

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。