REVOKE

Name

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 { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

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

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

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

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...]
         | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

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

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

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

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

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

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

描述

REVOKE命令从一个或者多个角色收回之前授予的特权。关键词PUBLIC表示所有角色隐式定义的组。

对于特权类型的含义请见GRANT命令的描述。

注意任何特定角色所拥有的特权都由三部分组成:直接授予给它的特权、授予给它的任一父角色的特权、授予给PUBLIC的特权。因此,例如要从PUBLIC收回SELECT特权并不一定意味着所有角色都会失去在对象上的SELECT特权:那些被直接授权或者通过另一个角色被授权的角色还是具有该特权。类似地,从一个用户收回SELECT可能不会阻止该用户使用,因为PUBLIC或另一个父角色还有SELECT权利。

如果指定了GRANT OPTION FOR,只有用于那些特权的授予选项被回收,特权本身不会被回收。否则,特权及其授予选项都会被回收。

如果一个用户持有带授予选项的特权并且已经把它授予给了其他用户,那么由那些其他用户持有的特权就被称作从属特权。如果第一个用户持有的特权或者授予选项被收回并且存在从属特权,指定CASCADE将会把从属特权也收回,如果没有指定CASCADE则回收动作会失败。这种递归的回收只影响通过对REVOKE命令的回收目标用户可追踪的用户链授出的特权。因此,如果受影响的用户还被其他用户授予了该特权,它可能实际上还是具有该特权。

在收回一个表上的特权时,也会从该表的每一列上自动收回相应的列特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的特权,那么从个体列上收回同样的特权将不会产生效果。

在收回一个角色中的成员关系时,GRANT OPTION被改称为ADMIN OPTION,但是行为是相似的。还要注意该命令的这种形式不允许使用GROUP

注解

使用psql\dp命令可以显示在现有表和列上已授出的特权。关于格式请见GRANT。对于非表对象有其他的\d命令可以显示它们的特权。

一个用户只能收回由它直接授出的特权。例如,如果用户 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拥有,u1g1的一个成员,那么u1可以在t1上收回由g1授出的特权。这可能包括u1完成的授权以及角色g1的其他成员完成的授权。

如果执行REVOKE的角色持有通过超过一条角色成员关系路径间接得到的特权,那么就没有指定要用哪个父角色来执行该命令。在这样的情况下,最好使用SET ROLE来成为你要用其进行REVOKE的特定角色。不这样做可能会导致收回非你预期的特权,或者根本不收回任何特权。

例子

films表上收回 public 的插入特权:

REVOKE INSERT ON films FROM PUBLIC;

从用户manuel收回在视图kinds上所有的特权:

REVOKE ALL PRIVILEGES ON kinds FROM manuel;

这实际上表示"收回我授出的所有特权"

从用户joe收回角色admins中的成员关系:

REVOKE admins FROM joe;

兼容性

GRANT命令的兼容性注解也相似地适合于REVOKE。根据标准,关键词RESTRICTCASCADE是必须被指定的,但是PostgreSQL默认假定RESTRICT

参见

GRANT