支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

GRANT

GRANT — 定義存取權限

概要

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }
    ON PARAMETER configuration_parameter [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT role_name [, ...] TO role_specification [, ...]
    [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ]
    [ GRANTED BY role_specification ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

描述

GRANT 指令有兩個基本變體:一個是授予資料庫物件(表格、欄位、檢視表、外部表格、序列、資料庫、外部資料封裝器、外部伺服器、函數、程序、程序語言、大型物件、配置參數、綱要或類型)的權限,另一個是授予角色成員資格。這些變體在許多方面都很相似,但它們的不同之處足以單獨描述。

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

授予物件類型可用的所有權限。 儘管嚴格的 SQL 需要 PRIVILEGES 關鍵字,但在 PostgreSQL 中它是可選的。

FUNCTION 語法適用於普通函數、聚合函數和視窗函數,但不適用於程序; 對於程序,請使用 PROCEDURE。 或者,使用 ROUTINE 來引用函數、聚合函數、視窗函數或程序,而不管其精確類型如何。

還有一個選項可以授予一個或多個綱要中相同類型的所有物件的權限。 目前僅支援表格、序列、函數和程序的此功能。 ALL TABLES 也會影響檢視表和外部表格,就像特定物件的 GRANT 指令一樣。 ALL FUNCTIONS 也會影響聚合函數和視窗函數,但不影響程序,同樣就像特定物件的 GRANT 指令一樣。 使用 ALL ROUTINES 來包含程序。

GRANT 對於角色

此變體的 GRANT 指令會將一個角色的成員資格授予一個或多個其他角色,並修改成員資格選項 SETINHERITADMIN; 有關詳細訊息,請參閱 第 21.3 節。 角色的成員資格意義重大,因為它可能允許存取授予角色的每個成員的權限,並且可能還允許變更角色本身。 但是,實際授予的權限取決於與授予關聯的選項。 若要修改現有成員資格的選項,只需指定具有更新選項值的成員資格即可。

下面描述的每個選項都可以設定為 TRUEFALSE。 關鍵字 OPTION 被接受為 TRUE 的同義字,因此 WITH ADMIN OPTIONWITH ADMIN TRUE 的同義字。 變更現有成員資格時,省略選項會導致保留目前值。

ADMIN 選項允許成員進而將角色中的成員資格授予其他人,以及撤銷角色中的成員資格。如果沒有管理員選項,一般使用者無法執行這些操作。角色本身不被認為持有 WITH ADMIN OPTION。資料庫超級使用者可以將任何角色的成員資格授予或撤銷給任何人。此選項預設為 FALSE

INHERIT 選項控制新成員資格的繼承狀態;有關繼承的詳細資訊,請參閱第 21.3 節。如果設定為 TRUE,則會導致新成員從被授予的角色繼承。如果設定為 FALSE,則新成員不會繼承。如果在建立新的角色成員資格時未指定,則預設為新成員的繼承屬性。

如果 SET 選項設定為 TRUE,則允許成員使用 SET ROLE 命令變更為被授予的角色。如果一個角色是另一個角色的間接成員,則只有在存在一系列授予,並且每個授予都具有 SET TRUE 時,它才能使用 SET ROLE 變更為該角色。此選項預設為 TRUE

要建立由另一個角色擁有的物件,或將現有物件的所有權授予另一個角色,您必須能夠 SET ROLE 為該角色;否則,諸如 ALTER ... OWNER TOCREATE 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 在命令中仍然允許,但它是一個雜訊詞。

如果使用者對特定欄位或其整個表格擁有該權限,則使用者可以對欄位執行 SELECTINSERT 等操作。在表格層級授予權限,然後針對一個欄位撤銷權限,並不會達到人們期望的效果:表格層級的授予不受欄位層級操作的影響。

當物件的非擁有者嘗試 GRANT 物件上的權限時,如果使用者對該物件沒有任何權限,則該命令將會直接失敗。只要有一些權限可用,該命令就會繼續執行,但它只會授予使用者擁有授予選項的權限。GRANT ALL PRIVILEGES 形式會在沒有授予選項時發出警告訊息,而其他形式會在命令中明確命名的任何權限的授予選項未持有時發出警告。

應該注意的是,資料庫超級使用者可以存取所有物件,而不管物件權限設定如何。這與 Unix 系統中 root 的權限相當。與 root 一樣,除非絕對必要,否則以超級使用者身分操作是不明智的。

如果超級使用者選擇發出 GRANTREVOKE 命令,則該命令的執行方式就好像它是由受影響物件的擁有者發出的一樣。特別是,透過此類命令授予的權限將顯示為由物件擁有者授予。(對於角色成員資格,成員資格顯示為由啟動引導超級使用者授予。)

GRANTREVOKE 也可以由不是受影響物件的擁有者的角色完成,但它是擁有該物件的角色的成員,或是持有該物件的 WITH GRANT OPTION 權限的角色的成員。在這種情況下,權限將被記錄為由實際擁有該物件或持有 WITH GRANT OPTION 權限的角色授予。例如,如果表格 t1 由角色 g1 擁有,而角色 u1g1 的成員,則 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 允許物件擁有者撤銷他們自己的普通權限:例如,一個資料表的擁有者可以透過撤銷他們自己的 INSERTUPDATEDELETETRUNCATE 權限,讓該資料表對他們自己來說是唯讀的。根據 SQL 標準,這是不可行的。原因是 PostgreSQL 將擁有者的權限視為由擁有者授予給自己;因此他們也可以撤銷這些權限。在 SQL 標準中,擁有者的權限是由一個假定的實體 _SYSTEM 授予的。因為不是 _SYSTEM,所以擁有者不能撤銷這些權利。

根據 SQL 標準,授予選項可以授予給 PUBLIC;PostgreSQL 僅支援將授予選項授予角色。

SQL 標準允許 GRANTED BY 選項僅指定 CURRENT_USERCURRENT_ROLE。其他變體是 PostgreSQL 的擴充功能。

SQL 標準為其他種類的物件提供了 USAGE 權限:字元集、校對規則、轉換。

在 SQL 標準中,序列僅具有 USAGE 權限,該權限控制 NEXT VALUE FOR 表達式的使用,該表達式相當於 PostgreSQL 中的函數 nextval。序列權限 SELECTUPDATE 是 PostgreSQL 的擴充功能。將序列 USAGE 權限應用於 currval 函數也是 PostgreSQL 的擴充功能(函數本身也是如此)。

資料庫、表格空間、結構描述、語言和配置參數的權限是 PostgreSQL 的擴充功能。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表單來報告文件問題。