REVOKE — 移除存取權限
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }function_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]role_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] whererole_specification
can be: [ GROUP ]role_name
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
REVOKE
命令會撤銷先前授予給一個或多個角色的權限。關鍵字 PUBLIC
指的是隱式定義的所有角色的群組。
關於權限類型的意義,請參閱 GRANT
命令的描述。
請注意,任何特定角色都將擁有直接授予它的權限總和、授予它目前所屬的任何角色的權限,以及授予 PUBLIC
的權限。因此,例如,從 PUBLIC
撤銷 SELECT
權限並不一定意味著所有角色都失去了對該物件的 SELECT
權限:那些直接授予或通過另一個角色授予的角色仍然擁有該權限。同樣,從使用者撤銷 SELECT
可能不會阻止該使用者使用 SELECT
,如果 PUBLIC
或另一個成員角色仍然擁有 SELECT
權限。
如果指定了 GRANT OPTION FOR
,則僅撤銷權限的授予選項,而不是權限本身。否則,權限和授予選項都會被撤銷。
如果使用者擁有帶有授予選項的權限,並且已將其授予其他使用者,則其他使用者擁有的權限稱為依賴權限。如果要撤銷第一個使用者擁有的權限或授予選項,並且存在依賴權限,則如果指定了 CASCADE
,也會撤銷這些依賴權限;如果沒有指定,則撤銷操作將會失敗。這種遞迴撤銷僅影響透過可追溯到 REVOKE
命令主體的使用者的使用者鏈授予的權限。因此,如果也透過其他使用者授予了權限,受影響的使用者可能會有效地保留該權限。
撤銷表上的權限時,也會自動撤銷表上每個對應的欄位權限(如果有的話)。另一方面,如果已授予角色在表上的權限,則從單獨的欄位撤銷相同的權限將不會產生任何影響。
當撤銷角色的成員資格時,GRANT OPTION
會改稱為 ADMIN OPTION
,但行為類似。請注意,在 PostgreSQL 16 之前的版本中,不會追蹤角色成員資格授予的依賴權限,因此 CASCADE
對於角色成員資格沒有任何影響。現在已不再是這種情況。另請注意,此命令形式不允許在 role_specification
中使用雜訊字詞 GROUP
。
正如可以從現有的角色授予中移除 ADMIN OPTION
一樣,也可以撤銷 INHERIT OPTION
或 SET OPTION
。這相當於將對應選項的值設定為 FALSE
。
使用者只能撤銷由該使用者直接授予的權限。例如,如果使用者 A 將帶有授予選項的權限授予使用者 B,而使用者 B 又將其授予使用者 C,則使用者 A 無法直接從 C 撤銷該權限。相反,使用者 A 可以從使用者 B 撤銷授予選項,並使用 CASCADE
選項,以便依次從使用者 C 撤銷該權限。另一個例子是,如果 A 和 B 都將相同的權限授予 C,A 可以撤銷他們自己的授予,但不能撤銷 B 的授予,因此 C 仍然會有效地擁有該權限。
當物件的非擁有者嘗試在該物件上 REVOKE
權限時,如果使用者對該物件沒有任何權限,則該命令將會完全失敗。只要存在一些權限,該命令就會繼續執行,但它只會撤銷使用者擁有授予選項的那些權限。REVOKE ALL PRIVILEGES
形式在沒有授予選項時會發出警告訊息,而其他形式如果在命令中明確命名的任何權限的授予選項不存在時,也會發出警告。
如果超級使用者選擇發出 GRANT
或 REVOKE
命令,則該命令的執行方式就像是由受影響物件的擁有者發出的一樣。(由於角色沒有擁有者,因此在 GRANT
角色成員資格的情況下,該命令的執行方式就像是由啟動超級使用者發出的一樣。)由於所有權限最終都來自物件擁有者(可能間接地透過授予選項鏈),因此超級使用者可以撤銷所有權限,但這可能需要使用如上所述的 CASCADE
。
即使角色並非受影響物件的擁有者,仍然可以執行 REVOKE
,只要該角色是物件擁有者的成員,或者該角色是持有物件 WITH GRANT OPTION
權限的角色成員。 在這種情況下,命令的執行方式如同是由實際擁有物件或持有 WITH GRANT OPTION
權限的包含角色所發出。 例如,如果表 t1
的擁有者是角色 g1
,而角色 u1
是 g1
的成員,那麼 u1
就可以撤銷 t1
上由 g1
授權的權限。 這將包括由 u1
以及 g1
的其他成員授予的權限。
如果執行 REVOKE
的角色透過多個角色成員路徑間接持有權限,則不指定將使用哪個包含角色來執行該命令。 在這種情況下,最佳實踐是使用 SET ROLE
成為您想要執行 REVOKE
的特定角色。 否則可能會導致撤銷您不打算撤銷的權限,或者根本不撤銷任何權限。
有關特定權限類型以及如何檢查物件權限的更多資訊,請參閱 第 5.8 節。
撤銷 public 對表 films
的 insert 權限
REVOKE INSERT ON films FROM PUBLIC;
撤銷使用者 manuel
對視窗 kinds
的所有權限
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
請注意,這實際上意味著 “撤銷我授予的所有權限”。
撤銷使用者 joe
在角色 admins
中的成員資格
REVOKE admins FROM joe;
GRANT
命令的相容性注意事項同樣適用於 REVOKE
。 根據標準,需要關鍵字 RESTRICT
或 CASCADE
,但 PostgreSQL 預設採用 RESTRICT
。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來報告文件問題。