本文介紹了REVOKE的文法、說明以及樣本等內容。
文法
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
FROM role_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 SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
FROM role_specification [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ ADMIN OPTION FOR ]
role_name [, ...] FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER簡介
REVOKE命令收回之前從一個或者更多角色授予的特權。關鍵詞PUBLIC隱式定義的全部角色的組。
特權類型的含義見GRANT命令的描述。
注意任何特定角色擁有的特權包括直接授予給它的特權、從它作為其成員的角色中得到的特權以及授予給PUBLIC的特權。因此, 從PUBLIC收回SELECT特權並不一定會意味著所有角色都會失去在該對象上的SELECT特權:那些直接被授予的或者通過另一個角色被授予的角色仍然會擁有它。類似地,從一個使用者收回SELECT後,如果PUBLIC或者另一個成員關聯角色仍有SELECT權利,該使用者還是可以使用 SELECT。
如果指定了GRANT OPTION FOR,只會回收該特權的授予選項,特權本身不被回收。否則,特權及其授予選項都會被回收。
如果一個使用者持有一個帶有授予選項的特權並且把它授予給了其他使用者, 那麼被那些其他使用者持有的該特權被稱為依賴特權。如果第一個使用者持有的該特權或者授予選項正在被收回且存在依賴特權,指定 CASCADE可以連帶回收那些依賴特權,不指定則會導致回收動作失敗。這種遞迴回收隻影響通過可追溯到該 REVOKE命令的主體的使用者鏈授予的特權。因此, 如果該特權經由其他使用者授予給受影響使用者,受影響使用者可能實際上還保留有該特權。
在回收一個表上的特權時,也會在該表的每一個列上自動回收對應的列特權(如果有)。在另一方面,如果一個角色已經被授予一個表上的特權,那麼從個別的列上回收同一個特權將不會生效。
在回收一個角色中的成員關係時,GRANT OPTION被改稱為ADMIN OPTION,但行為是類似的。這種形式的命令也允許使用 GRANTED BY 選項,但該選項當前被忽略(除了檢查指定角色的存在)。也要注意這種形式的命令不允許在 role_specification 中使用雜訊詞GROUP。
說明
使用者只能回收由它直接授出的特權。例如,如果使用者 A 已經把一個帶有授予選項的特權授予給了使用者 B,並且使用者 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 是g1的一個成員,那麼u1能收回t1 上被記錄為由g1授出的特權。這會包括由u1 以及由角色g1的其他成員完成的授予。
如果執行REVOKE的角色持有通過多於一條角色成員關係路徑間接得到的特權,其中哪一條包含將被用於執行該命令的角色是沒有被指明的。在這種情況中,最好使用 SET ROLE成為你想作為其身份執行 REVOKE的特定角色。如果無法做到這一點可能會導致回收超過你預期的特權,或者根本回收不了任何東西。
樣本
從 public 收回表films上的插入特權:
REVOKE INSERT ON films FROM PUBLIC;從使用者manuel收回視圖 kinds上的所有特權:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;從使用者joe收回角色admins中的成員關係:
REVOKE admins FROM joe;