Postgresql 中文操作指南

REVOKE

REVOKE — 删除访问权限

Synopsis

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | 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

Description

REVOKE 命令从一个或多个角色处撤销先前授予的权限。关键字 PUBLIC 指的是所有角色的隐式定义的组。

有关权限类型的含义,请参阅 GRANT 命令的说明。

请注意,任何特定角色将拥有直接授予它的权限、授予它当前是其成员的任何角色的权限,以及授予 PUBLIC 的权限的总和。因此,例如,从 PUBLIC 撤销 SELECT 权限并不一定意味着所有角色都已在对象上丢失了 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

Notes

用户只能撤销由该用户直接授予的权限。例如,如果用户 A 已向用户 B 授予带有授予选项的权限,并且用户 B 已反过来授予它给用户 C,那么用户 A 无法直接从 C 处撤销该权限。相反,用户 A 可以从用户 B 那里撤销授予选项,并使用 CASCADE 选项,以便反过来从用户 C 那里撤销该权限。再举一个例子,如果 A 和 B 都向 C 授予了相同的权限,那么 A 可以撤销其自己的授予但不能撤销 B 的授予,因此 C 实际上仍然具有该权限。

当一个非对象所有者尝试执行 REVOKE 上的权限时,如果用户对对象没有任何权限,命令将直接失败。只要有一些权限可用,命令将继续进行,但它只会撤销那些用户拥有授予选项的权限。如果未持有授予选项, REVOKE ALL PRIVILEGES 形式会发出警告信息,而其他形式会在命令中明确命名的任何权限未持有授予选项时发出警告。(原则上,这些声明也适用于对象所有者,但由于所有者总是被视为掌握所有授予选项,所以永远不会出现这种情况。)

如果超级用户选择发出 GRANTREVOKE 命令,该命令将像受影响对象的所有者发出的命令一样执行。(由于角色不具有所有者,在角色成员资格的 GRANT 情况下,该命令将像引导程序超级用户发出的命令一样执行。)由于所有权限最终都来自对象所有者(可能是通过授予选项链间接获得),因此超级用户可以撤销所有权限,但这可能需要如上所述使用 CASCADE

REVOKE 也可以由不是受影响对象的所有者但属于拥有该对象的角色,或属于对该对象持有 WITH GRANT OPTION 权限的角色的角色来完成。在这种情况下,该命令将像由实际拥有该对象或持有 WITH GRANT OPTION 权限的包含角色发出一样执行。例如,如果表 t1 由角色 g1 所有,其中角色 u1 是其成员,则 u1 可以撤销 t1 中记录为 g1 授予的权限。这将包括 u1 以及角色 g1 的其他成员授予的权限。

如果执行 REVOKE 的角色通过多个角色成员资格路径间接持有权限,则未指定哪个包含角色将用于执行命令。在这些情况下,最好的做法是使用 SET ROLE 成为你要作为其来执行 REVOKE 的特定角色。未能这样做可能导致撤销与你意图不同的权限,或者根本不撤销任何权限。

有关特定权限类型的详细信息以及如何检查对象的权限,请参阅 Section 5.7

Examples

撤销公共角色对表 films 的插入权限:

REVOKE INSERT ON films FROM PUBLIC;

从视图 kinds 中撤销用户 manuel 的所有权限:

REVOKE ALL PRIVILEGES ON kinds FROM manuel;

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

撤销用户 joe 对角色 admins 中的成员资格:

REVOKE admins FROM joe;

Compatibility

GRANT 命令的兼容性说明同样适用于 REVOKE 。根据标准,关键字 RESTRICTCASCADE 是必需的,但 PostgreSQL 默认情况下假设 RESTRICT