删除访问特权。
语法
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
的特定角色。否则,可能会导致撤销的特权并不是希望撤销的那些,或者根本未撤销任何特权。
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;