刪除訪問特權(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)。
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;