ALTER DEFAULT PRIVILEGES允許你設定將被應用於未來要建立的對象的特權(它不會影響分配給已經存在的對象的特權)。
簡介
當前,只能修改用於模式、表(包括視圖和外部表格)、序列、函數和類型(包括域)的特權。其中,可設定許可權的函數包括聚集合函式和過程函數。當這個命令應用於函數時,單詞FUNCTIONS和ROUTINES是等效的。(推薦使用ROUTINES,因為它是用來囊括函數和過程的一個標準術語。在較早的 PolarDB 發行版中,只允許單詞FUNCTIONS。無法為函數或過程單獨設定預設特權。)
你只能改變你自己或者你屬於其中的角色所建立的對象的預設特權。這些特權可以對全域範圍設定(即對當前資料庫中建立的所有對象),或者只對在指定模式中建立的對象設定。用於任何物件類型的預設特權通常會把所有可授與權限授予給對象擁有者,並且也可能授予一些特權給PUBLIC。不過,這種行為可以通過使用ALTER DEFAULT PRIVILEGES修改全域預設特權來改變。
每個模式規定的預設許可權將添加到特定物件類型的全域預設特權的內容中。 這意味著你不能撤銷每個模式的特權,如果它們已經被全域授予(預設情況下,或者根據以前未規定模式的ALTER DEFAULT PRIVILEGES命令)。 每個模式的REVOKE僅用於反轉以前每個模式GRANT的影響。
文法
ALTER DEFAULT PRIVILEGES
[ FOR { ROLE | USER } target_role [, ...] ]
[ IN SCHEMA schema_name [, ...] ]
abbreviated_grant_or_revoke
其中abbreviated_grant_or_revoke是下列之一:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON TABLES
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON SEQUENCES
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTIONS | ROUTINES }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPES
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | CREATE | ALL [ PRIVILEGES ] }
ON SCHEMAS
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON TABLES
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON SEQUENCES
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTIONS | ROUTINES }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPES
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | CREATE | ALL [ PRIVILEGES ] }
ON SCHEMAS
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]參數
target_role一個現有角色的名稱,當前角色是它的一個成員。如果FOR ROLE被忽略,將假定為當前角色。
schema_name一個現有模式的名稱。如果被指定,以後在那個模式中建立的對象的預設特權會被修改。如果IN SCHEMA被忽略,全域預設特權會被修改。 當設定特權給模式時不能使用IN SCHEMA,因為模式不能嵌套。
role_name要為其授予或者收回特權的一個現有角色的名稱。這個參數以及所有 abbreviated_grant_or_revoke中的其他參數會按照 GRANT 或者 REVOKE 中描述的方式運作,不過這裡是為一整類的對象而不是特別指定的對象設定許可權。
說明
如果你希望刪除一個預設特權被修改的角色,有必要撤銷其預設特權上的改變或者使用DROP OWNED BY來為該角色去除預設特權項。
樣本
為你後續在模式myschema中建立的所有表(和視圖)授予 SELECT 特權,並且也允許角色webuser向它們之中 INSERT 資料:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser;撤銷上面的動作,因此後續建立的表不會有任何不尋常的許可權:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;為後續由角色admin建立的所有函數移除通常在函數上會授予的公用 EXECUTE 許可權:
ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;但是注意你不能使用限制為單個模式的命令來實現該效果。 此命令不起作用,除非它撤消匹配的GRANT:
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;這是因為每個模式的預設特權只能向全域設定添加特權,而不能移除它授予的特權。