刪除訪問特權(quán)。

語法

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 命令會從一個(gè)或多個(gè)角色撤銷之前授予的特權(quán)。關(guān)鍵字 PUBLIC 是指隱式定義的、包含所有角色的組。

有關(guān)特權(quán)類型的含義,請參見 GRANT 命令的描述。

請注意,任何特定角色都具有以下所有特權(quán):直接為它授予的特權(quán)、授予它目前所屬的任何角色的特權(quán)以及授予 PUBLIC 的特權(quán)。因此舉例來說,從 PUBLIC 撤銷 SELECT 特權(quán)并不一定意味著所有角色都會失去有關(guān)該對象的 SELECT 特權(quán):直接為其授予或者通過其他角色為其授予的角色將仍然具有該特權(quán)。

如果已使用授權(quán)選項(xiàng)授予該特權(quán),則該特權(quán)的授權(quán)選項(xiàng)會連同特權(quán)本身一起被撤銷。

如果用戶通過授權(quán)選項(xiàng)持有授權(quán),而且已將其授予其他用戶,則其他那些用戶具有的特權(quán)被稱為依賴特權(quán)。如果要撤銷第一位用戶持有的特權(quán)或授權(quán)選項(xiàng)并且存在依賴特權(quán),則在指定 CASCADE 時(shí),那些依賴特權(quán)會被同時(shí)撤銷,否則撤銷操作將失敗。此遞歸撤銷僅影響通過一系列用戶授予的特權(quán),而這組用戶可追蹤到作為該 REVOKE 命令使用者的各個(gè)用戶。所以,如果受影響用戶也是通過其他用戶得到授權(quán),則可以有效地保留特權(quán)。

重要 CASCADE 選項(xiàng)與 Oracle 數(shù)據(jù)庫不兼容。默認(rèn)情況下,Oracle 始終會級聯(lián)依賴特權(quán),但PolarDB PostgreSQL版(兼容Oracle)需要隱性給出 CASCADE 關(guān)鍵字,否則 REVOKE 命令將失敗。

在撤銷角色中的成員資格時(shí),調(diào)用 GRANTOPTION 而不是 ADMIN OPTION,但行為是相似的。

注釋

用戶只能撤銷其直接授予的特權(quán)。例如,如果用戶 A 已使用授權(quán)選項(xiàng)將一項(xiàng)特權(quán)授予用戶 B,而用戶 B 又將該特權(quán)授予用戶 C,則用戶 A 不能從 C 直接撤銷該特權(quán)。相反,用戶 A 應(yīng)該從用戶 B 撤銷授權(quán)選項(xiàng)并使用 CASCADE 選項(xiàng),繼而從用戶 C 撤銷特權(quán)。在另一個(gè)示例中,如果 A 和 B 已將同一特權(quán)授予 C,A 可以撤銷自己的授權(quán),但不能撤銷 B 的授權(quán),因此 C 實(shí)際上將仍然具有該特權(quán)。

當(dāng)對象所有者以外的用戶嘗試為對象 REVOKE 特權(quán)時(shí),如果該用戶不具有有關(guān)對象的任何特權(quán),則該命令將立即失敗。只要某個(gè)特權(quán)可用,該命令就可以繼續(xù),但它僅撤銷用戶具有其授權(quán)選項(xiàng)的那些特權(quán)。如果不具有授權(quán)選項(xiàng),REVOKE ALL PRIVILEGES 格式將發(fā)出警告消息;如果不具有在命令中明確列出的任何特權(quán)的授權(quán)選項(xiàng),則其他格式將發(fā)出警告。(總的來說,以上說明也適用于對象使用者,但由于所有者始終被視為具有所有授權(quán)選項(xiàng),因此絕不會發(fā)生這些情況。)

執(zhí)行 REVOKE 的角色也可以不是受影響對象的所有者,而是擁有該對象的角色成員,或者是具有該對象的 WITH GRANT OPTION 特權(quán)的角色成員。在這種情況下,會像由實(shí)際擁有對象或具有 WITH GRANT OPTION 特權(quán)的包含角色發(fā)出該命令一樣來執(zhí)行它。例如,如果表 t1 由角色 g1 擁有,而角色 u1 是其成員,則 u1 可以撤銷記錄為由 g1 授權(quán)的、針對 t1 的特權(quán)。這將包括 u1 以及角色 g1 的其他成員給予的授權(quán)。

如果執(zhí)行 REVOKE 的角色通過多個(gè)成員資格路徑間接具有特權(quán),則不會指定將使用哪一包含角色執(zhí)行該命令。在此類情況下,最佳實(shí)踐是使用 SET ROLE 以成為您希望由其執(zhí)行 REVOKE 的特定角色。否則,可能會導(dǎo)致撤銷的特權(quán)并不是希望撤銷的那些,或者根本未撤銷任何特權(quán)。

說明 PolarDB PostgreSQL版(兼容Oracle)ALTER ROLE 命令還支持這樣的語法:該語法撤銷創(chuàng)建公共或私有 database link 時(shí)需要的系統(tǒng)特權(quán),或者撤銷對細(xì)粒度訪問控制策略 (DBMS_RLS) 的豁免。ALTER ROLE 語法的作用等同于對應(yīng)的 REVOKE 命令,并與 Oracle 數(shù)據(jù)庫兼容。

示例

撤銷針對表 emp 的公共插入特權(quán):

REVOKE INSERT ON emp FROM PUBLIC;

撤銷用戶 mary 對視圖 salesemp 具有的所有特權(quán):

REVOKE ALL PRIVILEGES ON salesemp FROM mary;

請注意,這實(shí)際意味著“撤銷我授予的所有特權(quán)”。

從用戶 joe 撤銷角色 admins 中的成員資格:

REVOKE admins FROM joe;

從 joe 用戶撤銷 CONNECT特權(quán):

REVOKE CONNECT FROM joe;

從用戶 joe 撤銷 CREATE DATABASE LINK 特權(quán):

REVOKE CREATE DATABASE LINK FROM joe;

從用戶 joe 撤銷 EXEMPT ACCESS POLICY 特權(quán):

REVOKE EXEMPT ACCESS POLICY FROM joe;