使用者只能撤消該使用者直接授予的權限。例如,如果使用者 A 已向使用者 B 授予了具有 grant 選項的權限,並且使用者 B 已將其授權給使用者 C,則使用者 A 無法直接從 C 撤銷該權限。相反地,使用者 A 可以撤銷使用者 B 的授予選項並使用 CASCADE 選項,以便從使用者 C 撤銷該權限。另一個例子,如果 A 和 B 都授予了與 C 相同的權限,A 可以撤銷他們自己的授權而不是 B 的授權,所以 C 仍然會有效地享有權限。
當物件的非擁有者嘗試 REVOKE 物件的權限時,如果使手者對該物件沒有任何權限,則該指令將會失敗。只要有一些權限可用,該指令就會繼續,但它將僅撤銷使用者具有授權選項的權限。如果沒有保留授權選項,REVOKE ALL PRIVILEGES 語句將發出警告消息,而如果未保留指令中特定指名的任何權限的授予選項,則其他語句將發出警告。 (原則上這些陳述也適用於物件擁有者,但由於擁有者始終被視為持有所有授權選項,因此此案例永遠不會發生。)
如果超級使用者選擇發出 GRANT 或 REVOKE 指令,則執行該指令時,就好像它是受影響物件的擁有者發出的一樣。由於所有權限最終都來自物件擁有者(可能間接透過授權鏈結),超級使用者可以撤銷所有權限,但這可能需要使用 CASCADE,如上所述。
REVOKE 也可以由不是受影響物件的擁有者角色完成,但是是擁有該物件的角色成員,或者是對該角色擁有 WITH GRANT OPTION 權限的角色成員。在這種情況下,執行命令就好像它是由實際擁有該物件的包含角色發出的,或者擁有 WITH GRANT OPTION 權限。例如,如果資料表 t1 由角色 g1 擁有,其中角色 u1 是成員,則 u1 可以撤銷 t1 上記錄為由 g1 授予的權限。這將包括由 u1 以及角色 g1 的其他成員進行的授權。
如果執行 REVOKE 的角色透過多個角色成員資格路徑間接保留權限,則未指定包含角色的角色將用於執行命令。在這種情況下,最佳做法是使用 SET ROLE 成為您要執行 REVOKE 的特定角色。如果不這樣做,可能會導致撤銷您預期權限之外的權限,或者根本未撤消任何權限。
範例
在資料表 film 上撤銷 public 的 INSERT 權限:
REVOKE INSERT ON films FROM PUBLIC;
在檢視表 kinds 上撤消所有使用者 manuel 的權限:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
請注意,這實際上意味著「撤銷由我所授予的所有權限」。
將使用者 joe 撤消角色 admins 的成員資格:
REVOKE admins FROM joe;
相容性
GRANT 指令的相容性說明同樣適用於 REVOKE。根據標準需要指定 RESTRICT 或 CASCADE,但 PostgreSQL 預設採用 RESTRICT。