删除访问特权。

语法

REVOKE { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
  [,...] | ALL [ PRIVILEGES ] }
  ON tablename
  FROM { username | groupname | PUBLIC } [, ...]
  [ CASCADE | RESTRICT ]

REVOKE { SELECT | ALL [ PRIVILEGES ] }
  ON sequencename
  FROM { username | groupname | PUBLIC } [, ...]
  [ CASCADE | RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
  ON FUNCTION progname
    ( [ [ argmode ] [ argname ] argtype ] [, ...] )
  FROM { username | groupname | PUBLIC } [, ...]
  [ CASCADE | RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
  ON PROCEDURE progname
    [ ( [ [ argmode ] [ argname ] argtype ] [, ...] ) ]
  FROM { username | groupname | PUBLIC } [, ...]
  [ CASCADE | RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
  ON PACKAGE packagename
  FROM { username | groupname | PUBLIC } [, ...]
  [ CASCADE | RESTRICT ]

REVOKE role [, ...] FROM { username | groupname | PUBLIC }
  [, ...]
  [ CASCADE | RESTRICT ]

REVOKE { CONNECT | RESOURCE | DBA } [, ...]
  FROM { username | groupname } [, ...]

REVOKE CREATE [ PUBLIC ] DATABASE LINK
  FROM { username | groupname }

REVOKE DROP PUBLIC DATABASE LINK
  FROM { username | groupname }

REVOKE EXEMPT ACCESS POLICY
  FROM { username | groupname }

说明

REVOKE 命令会从一个或多个角色撤销之前授予的特权。关键字 PUBLIC 是指隐式定义的、包含所有角色的组。

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

请注意,任何特定角色都具有以下所有特权:直接为它授予的特权、授予它目前所属的任何角色的特权以及授予 PUBLIC 的特权。因此举例来说,从 PUBLIC 撤销 SELECT 特权并不一定意味着所有角色都会失去有关该对象的 SELECT 特权:直接为其授予或者通过其他角色为其授予的角色将仍然具有该特权。

如果已使用授权选项授予该特权,则该特权的授权选项会连同特权本身一起被撤销。

如果用户通过授权选项持有授权,而且已将其授予其他用户,则其他那些用户具有的特权被称为依赖特权。如果要撤销第一位用户持有的特权或授权选项并且存在依赖特权,则在指定 CASCADE 时,那些依赖特权会被同时撤销,否则撤销操作将失败。此递归撤销仅影响通过一系列用户授予的特权,而这组用户可追踪到作为该 REVOKE 命令使用者的各个用户。所以,如果受影响用户也是通过其他用户得到授权,则可以有效地保留特权。

重要 CASCADE 选项与 Oracle 数据库不兼容。默认情况下,Oracle 始终会级联依赖特权,但PolarDB PostgreSQL版(兼容Oracle)需要隐性给出 CASCADE 关键字,否则 REVOKE 命令将失败。

在撤销角色中的成员资格时,调用 GRANTOPTION 而不是 ADMIN OPTION,但行为是相似的。

注释

用户只能撤销其直接授予的特权。例如,如果用户 A 已使用授权选项将一项特权授予用户 B,而用户 B 又将该特权授予用户 C,则用户 A 不能从 C 直接撤销该特权。相反,用户 A 应该从用户 B 撤销授权选项并使用 CASCADE 选项,继而从用户 C 撤销特权。在另一个示例中,如果 A 和 B 已将同一特权授予 C,A 可以撤销自己的授权,但不能撤销 B 的授权,因此 C 实际上将仍然具有该特权。

当对象所有者以外的用户尝试为对象 REVOKE 特权时,如果该用户不具有有关对象的任何特权,则该命令将立即失败。只要某个特权可用,该命令就可以继续,但它仅撤销用户具有其授权选项的那些特权。如果不具有授权选项,REVOKE ALL PRIVILEGES 格式将发出警告消息;如果不具有在命令中明确列出的任何特权的授权选项,则其他格式将发出警告。(总的来说,以上说明也适用于对象使用者,但由于所有者始终被视为具有所有授权选项,因此绝不会发生这些情况。)

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

如果执行 REVOKE 的角色通过多个成员资格路径间接具有特权,则不会指定将使用哪一包含角色执行该命令。在此类情况下,最佳实践是使用 SET ROLE 以成为您希望由其执行 REVOKE 的特定角色。否则,可能会导致撤销的特权并不是希望撤销的那些,或者根本未撤销任何特权。

说明 PolarDB PostgreSQL版(兼容Oracle)ALTER ROLE 命令还支持这样的语法:该语法撤销创建公共或私有 database link 时需要的系统特权,或者撤销对细粒度访问控制策略 (DBMS_RLS) 的豁免。ALTER ROLE 语法的作用等同于对应的 REVOKE 命令,并与 Oracle 数据库兼容。

示例

撤销针对表 emp 的公共插入特权:

REVOKE INSERT ON emp FROM PUBLIC;

撤销用户 mary 对视图 salesemp 具有的所有特权:

REVOKE ALL PRIVILEGES ON salesemp FROM mary;

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

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

REVOKE admins FROM joe;

从 joe 用户撤销 CONNECT特权:

REVOKE CONNECT FROM joe;

从用户 joe 撤销 CREATE DATABASE LINK 特权:

REVOKE CREATE DATABASE LINK FROM joe;

从用户 joe 撤销 EXEMPT ACCESS POLICY 特权:

REVOKE EXEMPT ACCESS POLICY FROM joe;