GRANT — 定義訪問許可權
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }routine_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANTrole_name
[, ...] TOrole_specification
[, ...] [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ] [ GRANTED BYrole_specification
] whererole_specification
can be: [ GROUP ]role_name
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
GRANT
命令有兩種基本變體:一種是授予資料庫物件(表、列、檢視、外部表、序列、資料庫、外部資料包裝器、外部伺服器、函式、過程、過程語言、大物件、配置檔案引數、模式、表空間或型別)的許可權,另一種是授予某個角色的成員資格。這兩種變體在許多方面都相似,但又足夠不同,因此需要分開描述。
這個變體的 GRANT
命令將資料庫物件的特定許可權授予一個或多個角色。這些許可權將新增到已授予的許可權(如果有)之上。
關鍵字 PUBLIC
表示許可權將授予所有角色,包括將來可能建立的角色。PUBLIC
可以被視為一個隱式定義的使用者組,它總是包含所有角色。任何特定角色將擁有直接授予給它的許可權、授予給它當前是成員的任何角色的許可權,以及授予給 PUBLIC
的許可權的總和。
如果指定了 WITH GRANT OPTION
,則接收許可權的角色可以將其轉授給其他人。如果沒有授予選項,接收者就不能這樣做。授予選項不能授予給 PUBLIC
。
如果指定了 GRANTED BY
,則指定的授予者必須是當前使用者。此子句目前以這種形式存在,僅為符合 SQL 標準。
沒有必要授予物件所有者(通常是建立該物件的使用者)許可權,因為所有者預設擁有所有許可權。(然而,所有者可以選擇撤銷自己的一些許可權以保證安全。)
刪除物件或以任何方式更改其定義的許可權不是可授予的許可權;它屬於所有者固有許可權,不能授予或撤銷。(然而,透過授予或撤銷某個角色的成員資格(該角色是物件的所有者)可以獲得類似的效果;如下文所述。)所有者也隱含地擁有該物件的所有授予選項。
可能的許可權有:
SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE
SET
ALTER SYSTEM
MAINTAIN
特定型別的許可權,如 第 5.8 節中所定義。
TEMP
TEMPORARY
的替代拼寫。
ALL PRIVILEGES
授予物件型別的所有可用許可權。PRIVILEGES
關鍵字在 PostgreSQL 中是可選的,儘管嚴格的 SQL 要求它。
FUNCTION
語法適用於普通函式、聚合函式和視窗函式,但不適用於過程;請使用 PROCEDURE
來處理過程。或者,可以使用 ROUTINE
來指代函式、聚合函式、視窗函式或過程,無論其精確型別如何。
還可以選擇在模式內的一個或多個模式上授予所有同類型物件的許可權。此功能目前僅支援表、序列、函式和過程。ALL TABLES
也像特定物件的 GRANT
命令一樣,會影響檢視和外部表。ALL FUNCTIONS
也像特定物件的 GRANT
命令一樣,會影響聚合函式和視窗函式,但不影響過程。使用 ALL ROUTINES
來包含過程。
這個變體的 GRANT
命令將某個角色的成員資格授予一個或多個其他角色,並修改成員資格選項 SET
、INHERIT
和 ADMIN
;有關詳細資訊,請參見 第 21.3 節。角色的成員資格很重要,因為它可能允許成員訪問授予給該角色的許可權,並且可能還允許修改角色本身。但是,實際授予的許可權取決於與授予關聯的選項。要修改現有成員資格的選項,只需指定具有更新選項值的成員資格。
以下每個選項都可以設定為 TRUE
或 FALSE
。關鍵字 OPTION
被接受為 TRUE
的同義詞,因此 WITH ADMIN OPTION
是 WITH ADMIN TRUE
的同義詞。在修改現有成員資格時,省略某個選項將保留當前值。
ADMIN
選項允許成員反過來將該角色的成員資格授予他人,並撤銷該角色的成員資格。如果沒有管理員選項,普通使用者就不能這樣做。角色不被認為持有對其自身的 WITH ADMIN OPTION
。資料庫超級使用者可以向任何人授予或撤銷任何角色的成員資格。此選項預設為 FALSE
。
INHERIT
選項控制新成員資格的繼承狀態;有關繼承的詳細資訊,請參閱 第 21.3 節。如果設定為 TRUE
,則新成員將繼承授予角色的屬性。如果設定為 FALSE
,則新成員不繼承。在建立新角色成員資格時未指定時,此項預設為新成員的繼承屬性。
如果 SET
選項設定為 TRUE
,則允許成員使用 SET ROLE
命令切換到授予的角色。如果一個角色是另一個角色的間接成員,它只能透過 SET ROLE
切換到該角色,前提是有一個授予鏈,其中每個授予都設定為 SET TRUE
。此選項預設為 TRUE
。
要建立由另一個角色擁有的物件或將現有物件的所有權授予另一個角色,您必須能夠將 SET ROLE
設定為該角色;否則,像 ALTER ... OWNER TO
或 CREATE DATABASE ... OWNER
這樣的命令將失敗。然而,繼承了某個角色許可權但無法透過 SET ROLE
切換到該角色的使用者,可能可以透過操作該角色擁有的現有物件來獲得該角色的完整訪問許可權(例如,他們可以將現有函式重新定義為特洛伊木馬)。因此,如果某個角色的許可權要被繼承,但不應透過 SET ROLE
訪問,則該角色不應擁有任何 SQL 物件。
如果指定了 GRANTED BY
,則授予被記錄為由指定角色完成。使用者只能將授予歸因於另一個角色,如果他們擁有該角色的許可權。被記錄為授予者的角色必須擁有目標角色的 ADMIN OPTION
,除非它是引導超級使用者。當授予被記錄為擁有一個非引導超級使用者以外的授予者時,它取決於授予者繼續擁有該角色的 ADMIN OPTION
;因此,如果 ADMIN OPTION
被撤銷,則依賴的授予也必須被撤銷。
與許可權不同,角色的成員資格不能授予給 PUBLIC
。另請注意,此命令形式不允許在 role_specification
中使用噪聲詞 GROUP
。
REVOKE
命令用於撤銷訪問許可權。
自 PostgreSQL 8.1 起,使用者和組的概念已統一為一個名為角色的實體。因此,不再需要使用關鍵字 GROUP
來區分被授予者是使用者還是組。GROUP
在命令中仍然允許,但它是一個噪聲詞。
使用者可以在列上執行 SELECT
、INSERT
等操作,前提是他們擁有該特定列或其整個表的相應許可權。在表級別授予許可權,然後為其某個列撤銷許可權,並不會實現您可能期望的結果:表級別的授予不受列級別操作的影響。
當非物件所有者嘗試 GRANT
物件上的許可權時,如果使用者對該物件沒有任何許可權,命令將直接失敗。只要有任何許可權可用,命令就會繼續執行,但它只會授予使用者擁有授予選項的那些許可權。GRANT ALL PRIVILEGES
表單在沒有授予選項時會發出警告訊息,而其他表單在沒有所命令中明確命名的任何許可權的授予選項時會發出警告。(原則上,這些陳述也適用於物件所有者,但由於所有者始終被視為擁有所有授予選項,因此這些情況永遠不會發生。)
值得注意的是,資料庫超級使用者可以訪問所有物件,而不管物件許可權設定如何。這類似於 Unix 系統中的 root
的許可權。與 root
一樣,除非絕對必要,否則操作時不應以超級使用者身份進行。
如果超級使用者選擇發出 GRANT
或 REVOKE
命令,則該命令將執行,就好像它是由受影響物件的受影響物件的所有者發出的。特別是,透過此類命令授予的許可權將顯示為由物件所有者授予。(對於角色成員資格,成員資格顯示為由引導超級使用者授予。)
GRANT
和 REVOKE
也可以由不是受影響物件所有者,但屬於擁有該物件的角色的成員,或者屬於擁有該物件 WITH GRANT OPTION
的角色的成員的角色來執行。在這種情況下,許可權將被記錄為由實際擁有該物件或擁有 WITH GRANT OPTION
的許可權的角色直接授予。例如,如果表 t1
由角色 g1
擁有,而角色 u1
是 g1
的成員,那麼 u1
可以將 t1
的許可權授予 u2
,但這些許可權將顯示為直接由 g1
授予。 g1
的任何其他成員以後都可以撤銷它們。
如果執行 GRANT
的角色透過多個角色成員身份路徑間接擁有所需許可權,則不明確哪個包含角色將被記錄為已執行授予。在這種情況下,最佳實踐是使用 SET ROLE
來切換到您想要執行 GRANT
的特定角色。
授予表上的許可權不會自動將許可權擴充套件到表中使用的任何序列,包括與 SERIAL
列關聯的序列。序列上的許可權必須單獨設定。
有關特定許可權型別以及如何檢查物件許可權的更多資訊,請參閱 第 5.8 節。
向表 films
上的所有使用者授予插入許可權
GRANT INSERT ON films TO PUBLIC;
向用戶 manuel
在檢視 kinds
上授予所有可用許可權
GRANT ALL PRIVILEGES ON kinds TO manuel;
請注意,雖然以上內容如果由超級使用者或 kinds
的所有者執行,將確實授予所有許可權;但如果由其他人執行,它將僅授予該其他人擁有授予選項的那些許可權。
向用戶 joe
授予 admins
角色的成員資格
GRANT admins TO joe;
根據 SQL 標準,ALL PRIVILEGES
中的 PRIVILEGES
關鍵字是必需的。SQL 標準不支援一次性設定多個物件的許可權。
PostgreSQL 允許物件所有者撤銷自己的一般許可權:例如,表所有者可以透過撤銷自己的 INSERT
、UPDATE
、DELETE
和 TRUNCATE
許可權來使表對其自身變為只讀。根據 SQL 標準,這是不可能的。原因是 PostgreSQL 將所有者的許可權視為由所有者授予給自己;因此,它們也可以被撤銷。在 SQL 標準中,所有者的許可權是由一個假定的實體 “_SYSTEM” 授予的。所有者不是 “_SYSTEM”,因此不能撤銷這些許可權。
根據 SQL 標準,授予選項可以授予給 PUBLIC
;PostgreSQL 只支援將授予選項授予角色。
SQL 標準允許 GRANTED BY
選項僅指定 CURRENT_USER
或 CURRENT_ROLE
。其他變體是 PostgreSQL 的擴充套件。
SQL 標準為其他型別的物件提供了 USAGE
許可權:字元集、排序規則、翻譯。
在 SQL 標準中,序列只有 USAGE
許可權,它控制 NEXT VALUE FOR
表示式的使用,這相當於 PostgreSQL 中的 nextval
函式。序列許可權 SELECT
和 UPDATE
是 PostgreSQL 的擴充套件。序列 USAGE
許可權在 currval
函式上的應用(以及該函式本身)也是 PostgreSQL 的擴充套件。
資料庫、表空間、模式、語言和配置檔案引數上的許可權是 PostgreSQL 的擴充套件。
如果您在文件中發現任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。