ALTER DEFAULT PRIVILEGES
ALTER DEFAULT PRIVILEGES
允許你設(shè)置將被應(yīng)用于未來要創(chuàng)建的對象的特權(quán)(它不會影響分配給已經(jīng)存在的對象的特權(quán))。
簡介
當(dāng)前,只能修改用于模式、表(包括視圖和外部表)、序列、函數(shù)和類型(包括域)的特權(quán)。其中,可設(shè)置權(quán)限的函數(shù)包括聚集函數(shù)和過程函數(shù)。當(dāng)這個命令應(yīng)用于函數(shù)時,單詞FUNCTIONS
和ROUTINES
是等效的。(推薦使用ROUTINES
,因為它是用來囊括函數(shù)和過程的一個標(biāo)準(zhǔn)術(shù)語。在較早的 PolarDB 發(fā)行版中,只允許單詞FUNCTIONS
。無法為函數(shù)或過程單獨設(shè)置默認(rèn)特權(quán)。)
你只能改變你自己或者你屬于其中的角色所創(chuàng)建的對象的默認(rèn)特權(quán)。這些特權(quán)可以對全局范圍設(shè)置(即對當(dāng)前數(shù)據(jù)庫中創(chuàng)建的所有對象),或者只對在指定模式中創(chuàng)建的對象設(shè)置。用于任何對象類型的默認(rèn)特權(quán)通常會把所有可授予的權(quán)限授予給對象擁有者,并且也可能授予一些特權(quán)給PUBLIC
。不過,這種行為可以通過使用ALTER DEFAULT PRIVILEGES
修改全局默認(rèn)特權(quán)來改變。
每個模式規(guī)定的默認(rèn)權(quán)限將添加到特定對象類型的全局默認(rèn)特權(quán)的內(nèi)容中。 這意味著你不能撤銷每個模式的特權(quán),如果它們已經(jīng)被全局授予(默認(rèn)情況下,或者根據(jù)以前未規(guī)定模式的ALTER DEFAULT PRIVILEGES
命令)。 每個模式的REVOKE
僅用于反轉(zhuǎn)以前每個模式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 ]
參數(shù)
target_role
一個現(xiàn)有角色的名稱,當(dāng)前角色是它的一個成員。如果FOR ROLE
被忽略,將假定為當(dāng)前角色。
schema_name
一個現(xiàn)有模式的名稱。如果被指定,以后在那個模式中創(chuàng)建的對象的默認(rèn)特權(quán)會被修改。如果IN SCHEMA
被忽略,全局默認(rèn)特權(quán)會被修改。 當(dāng)設(shè)置特權(quán)給模式時不能使用IN SCHEMA
,因為模式不能嵌套。
role_name
要為其授予或者收回特權(quán)的一個現(xiàn)有角色的名稱。這個參數(shù)以及所有 abbreviated_grant_or_revoke
中的其他參數(shù)會按照 GRANT 或者 REVOKE 中描述的方式運(yùn)作,不過這里是為一整類的對象而不是特別指定的對象設(shè)置權(quán)限。
說明
如果你希望刪除一個默認(rèn)特權(quán)被修改的角色,有必要撤銷其默認(rèn)特權(quán)上的改變或者使用DROP OWNED BY
來為該角色去除默認(rèn)特權(quán)項。
示例
為你后續(xù)在模式myschema
中創(chuàng)建的所有表(和視圖)授予 SELECT 特權(quán),并且也允許角色webuser
向它們之中 INSERT 數(shù)據(jù):
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser;
撤銷上面的動作,因此后續(xù)創(chuàng)建的表不會有任何不尋常的權(quán)限:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;
為后續(xù)由角色admin
創(chuàng)建的所有函數(shù)移除通常在函數(shù)上會授予的公共 EXECUTE 權(quán)限:
ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
但是注意你不能使用限制為單個模式的命令來實現(xiàn)該效果。 此命令不起作用,除非它撤消匹配的GRANT
:
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
這是因為每個模式的默認(rèn)特權(quán)只能向全局設(shè)置添加特權(quán),而不能移除它授予的特權(quán)。