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 [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    FROM 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 [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM 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 [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    role_name [, ...] FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

Description

REVOKE命令撤消一个或多个角色先前授予的特权。关键字PUBLIC表示所有角色的隐式定义组。

有关特权类型的含义,请参见GRANT命令的描述。

请注意,任何特定角色都将具有直接授予它的特权,已授予其当前成员的任何角色的特权以及授予PUBLIC的特权的总和。因此,例如,从PUBLIC撤消SELECT特权并不一定意味着所有角色都失去了对该对象的SELECT特权:直接或通过其他角色授予该特权的人仍将拥有它。同样,如果PUBLIC或另一个成员角色仍然具有SELECT权限,则从用户撤消SELECT可能不会阻止该用户使用SELECT

如果指定了GRANT OPTION FOR,则仅撤销特权的授予选项,而不撤销特权本身。否则,特权和授予选项都将被吊销。

如果一个用户拥有带有授予选项的特权并将其授予其他用户,则这些其他用户所拥有的特权称为从属特权。如果第一个用户拥有的特权或授予选项被吊销并且存在从属特权,则如果指定了CASCADE,那些从属特权也将被吊销;否则,这些从属特权也将被吊销。如果不是,则撤销操作将失败。此递归吊销仅影响通过用户链授予的特权,这些特权可 traceback 到此REVOKE命令主题的用户。因此,如果还通过其他用户授予了特权,则受影响的用户可能会有效保留该特权。

撤消表的特权时,表的每一列也会自动撤消相应的列特权(如果有)。另一方面,如果已向角色授予表特权,则从各个列撤消相同特权将无效。

撤消角色成员身份时,GRANT OPTION称为ADMIN OPTION,但行为类似。这种形式的命令还允许使用GRANTED BY选项,但是该选项当前被忽略(除了检查命名角色的存在以外)。还要注意,这种形式的命令不允许* role_specification *中的噪声字GROUP

Notes

使用psql\dp命令显示在现有表和列上授予的特权。有关格式的信息,请参见GRANT。对于非表对象,还有其他\d命令可以显示其特权。

用户只能撤消该用户直接授予的特权。例如,如果用户 A 已向用户 B 授予了具有授予选项的特权,而用户 B 又将其授予了用户 C,则用户 A 无法直接从 C 撤消该特权。相反,用户 A 可以撤消授予选项。例如,如果 A 和 B 都向 C 授予了相同的特权,则 A 可以撤消他们自己的授予,但 B 不能授予 B 的授予,因此 C 仍将有效地享有特权。

当对象的非所有者尝试对该对象具有REVOKE特权时,如果用户对该对象没有任何特权,该命令将完全失败。只要有某些特权,该命令就会 continue 执行,但是只会撤消用户具有授予选项的那些特权。如果未保留任何授予选项,则REVOKE ALL PRIVILEGES表单将发出警告消息,而如果未保留针对命令中特别指定的任何特权的授予选项,则其他表单将发出警告。 (原则上,这些声明也适用于对象所有者,但是由于所有者总是被视为拥有所有授予选项,因此永远不会发生这种情况.)

如果超级用户选择发出GRANTREVOKE命令,则该命令的执行就像由受影响对象的所有者发出一样。由于所有特权最终都来自对象所有者(可能间接地通过授予选项链),因此超级用户可以撤消所有特权,但是如上所述,这可能需要使用CASCADE

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

如果执行REVOKE的角色通过多个角色成员资格路径间接持有特权,则未指定将使用哪个包含角色来执行命令。在这种情况下,最佳做法是使用SET ROLE成为您要执行REVOKE的特定角色。否则,可能会导致吊销您想要的特权以外的特权,或者根本不撤销任何特权。

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

See Also

GRANT