REVOKE
說明
REVOKE 指令從一個或多個角色撤消先前授予的權限。關鍵字 PUBLIC 指的是所有角色的群組。
有關權限類型的含義,請參閱 指令的說明。
請注意,任何特定角色都將擁有直接授予它的權限聯集,授予其目前成員的任何角色的權限,以及授予 PUBLIC 的權限。因此,例如,從 PUBLIC 撤消 SELECT 權限並不一定意味著所有角色都失去了物件的 SELECT 權限:直接授予或透過其他角色授予權限的人仍然擁有它。同樣,如果 PUBLIC 或其他成員身份角色仍具有 SELECT 權限,則從用戶撤消 SELECT 可能無法阻止該使用者使用 SELECT。
如果指定了 GRANT OPTION FOR,則僅撤消該權限的 grant 選項,而不是該權限本身。否則,將撤消權限和授予選項。
如果使用者擁有具有 grant 選項的權限並已將其授予其他使用者,則這些其他使用者所擁有的權限稱為從屬權限。如果第一個使用者持有的權限或授予選項被撤銷且存在相關權限,則如果指定了 CASCADE,則也會撤銷這些相關權限;如果不是,撤銷動作將失敗。此遞迴撤消僅影響透過可跟踪到此 REVOKE 指令使用者的使用者授予權限鏈結。 因此,受影響的使用者可以有效地保留該權限,如果它也是透過其他使用者授予的。
撤消角色中的成員資格時,GRANT OPTION 將被稱為 ADMIN OPTION,但行為類似。另請注意,此指令形式不允許使用 GROUP。
使用 psql 的 \dp 指令顯示在現有資料表和欄位上授予的權限。有關格式的訊息,請參閱 。對於非資料表物件,還有其他 \dcommands 可以顯示其權限。
使用者只能撤消該使用者直接授予的權限。例如,如果使用者 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 的角色透過多個角色成員資格路徑間接保留權限,則未指定包含角色的角色將用於執行命令。在這種情況下,最佳做法是使用 SET ROLE 成為您要執行 REVOKE 的特定角色。如果不這樣做,可能會導致撤銷您預期權限之外的權限,或者根本未撤消任何權限。
範例
在資料表 film 上撤銷 public 的 INSERT 權限:
在檢視表 kinds 上撤消所有使用者 manuel 的權限:
請注意,這實際上意味著「撤銷由我所授予的所有權限」。
將使用者 joe 撤消角色 admins 的成員資格: