支援的版本:目前 (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

CREATE ROLE

CREATE ROLE — 定義新的資料庫角色

概要

CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | SYSID uid

描述

CREATE ROLE 會新增一個新的角色到 PostgreSQL 資料庫叢集。角色是一種可以擁有資料庫物件並具有資料庫權限的實體;角色可以被視為一個使用者、一個群組,或取決於它如何使用的兩者。有關管理使用者和身份驗證的資訊,請參閱第 21 章第 20 章。您必須具有 CREATEROLE 權限或是資料庫超級使用者才能使用此指令。

請注意,角色是在資料庫叢集層級定義的,因此在叢集中的所有資料庫中都有效。

在建立角色期間,可以立即將新建立的角色指定為現有角色的成員,並將現有角色指定為新建立角色的成員。啟用哪些初始角色成員資格選項的規則在下面的 IN ROLEROLEADMIN 子句中描述。GRANT 指令在建立成員資格期間具有細粒度的選項控制,並且能夠在新角色建立後修改這些選項。

參數

name

新角色的名稱。

SUPERUSER
NOSUPERUSER

這些子句決定新角色是否為超級使用者,超級使用者可以覆寫資料庫中的所有存取限制。超級使用者身份很危險,僅應在真正需要時使用。您自己必須是超級使用者才能建立新的超級使用者。如果未指定,則預設為 NOSUPERUSER

CREATEDB
NOCREATEDB

這些子句定義角色建立資料庫的能力。如果指定了 CREATEDB,則允許正在定義的角色建立新的資料庫。指定 NOCREATEDB 將拒絕角色建立資料庫的能力。如果未指定,則預設為 NOCREATEDB。只有超級使用者角色或具有 CREATEDB 的角色才能指定 CREATEDB

CREATEROLE
NOCREATEROLE

這些子句決定是否允許角色建立、變更、捨棄、註解其他角色,以及變更其他角色的安全性標籤。有關此權限授予哪些功能的更多詳細資訊,請參閱角色建立。如果未指定,則預設為 NOCREATEROLE

INHERIT
NOINHERIT

當此角色新增為另一個角色的成員時,無論是現在的指令還是未來的指令,這都會影響成員資格繼承狀態。具體來說,它控制使用 IN ROLE 子句在此指令中新增的成員資格的繼承狀態,以及稍後使用 ROLE 子句在指令中新增的成員資格的繼承狀態。當使用 GRANT 指令將此角色新增為成員時,它也用作預設繼承狀態。如果未指定,則預設為 INHERIT

在 16 之前的 PostgreSQL 版本中,繼承是一個角色層級屬性,它控制該角色的所有運行時成員資格檢查。

LOGIN
NOLOGIN

這些子句決定是否允許角色登入;也就是說,是否可以在客戶端連線期間將角色作為初始會話授權名稱給出。具有 LOGIN 屬性的角色可以被認為是一個使用者。沒有此屬性的角色對於管理資料庫權限很有用,但在通常的意義上並不是使用者。如果未指定,則預設為 NOLOGIN,除非通過其替代拼寫 CREATE USER 呼叫 CREATE ROLE

REPLICATION
NOREPLICATION

這些子句決定角色是否為複製角色。角色必須具有此屬性(或是超級使用者)才能夠以複製模式(物理或邏輯複製)連接到伺服器,並且能夠建立或捨棄複製槽。具有 REPLICATION 屬性的角色是一個非常高權限的角色,僅應在實際用於複製的角色上使用。如果未指定,則預設為 NOREPLICATION。只有超級使用者角色或具有 REPLICATION 的角色才能指定 REPLICATION

BYPASSRLS
NOBYPASSRLS

這些子句決定角色是否繞過每個列級別安全性 (RLS) 策略。NOBYPASSRLS 是預設值。只有超級使用者角色或具有 BYPASSRLS 的角色才能指定 BYPASSRLS

請注意,pg_dump 預設會將 row_security 設為 OFF,以確保轉儲資料表的所有內容。如果執行 pg_dump 的使用者沒有適當的權限,則會傳回錯誤。但是,超級使用者和被轉儲資料表的所有者始終會繞過 RLS。

CONNECTION LIMIT connlimit

如果角色可以登入,這會指定該角色可以建立多少個並行連線。 -1 (預設值) 表示沒有限制。請注意,只有正常的連線會計入此限制。準備好的交易或背景工作程序連線都不會計入此限制。

[ ENCRYPTED ] PASSWORD 'password'
PASSWORD NULL

設定角色的密碼。(密碼僅適用於具有 LOGIN 屬性的角色,但您仍然可以為沒有該屬性的角色定義密碼。)如果您不打算使用密碼驗證,您可以省略此選項。如果未指定密碼,則密碼將設定為 null,並且該使用者的密碼驗證將始終失敗。空密碼可以選擇性地明確寫為 PASSWORD NULL

注意

指定空字串也會將密碼設定為 null,但在 PostgreSQL 10 版之前並非如此。在較早的版本中,可以使用或不使用空字串,具體取決於驗證方法和確切的版本,並且 libpq 在任何情況下都會拒絕使用它。為了避免歧義,應避免指定空字串。

密碼始終以加密形式儲存在系統目錄中。 ENCRYPTED 關鍵字無效,但為了向後相容性而被接受。加密方法由配置參數 password_encryption 決定。如果提供的密碼字串已經是 MD5 加密或 SCRAM 加密的格式,則無論 password_encryption 如何,都會按原樣儲存(因為系統無法解密指定的加密密碼字串,以不同的格式加密它)。這允許在傾印/恢復期間重新載入加密的密碼。

VALID UNTIL 'timestamp'

VALID UNTIL 子句設定一個日期和時間,在此之後角色的密碼不再有效。如果省略此子句,則密碼將永遠有效。

IN ROLE role_name

IN ROLE 子句會導致新角色自動新增為指定的現有角色的成員。新的成員資格將啟用 SET 選項,並停用 ADMIN 選項。除非指定 NOINHERIT 選項,否則將啟用 INHERIT 選項。

ROLE role_name

ROLE 子句會導致一個或多個指定的現有角色自動新增為成員,並啟用 SET 選項。實際上,這使得新角色成為一個群組。在此子句中命名的具有角色級別 INHERIT 屬性的角色,將在新成員資格中啟用 INHERIT 選項。新的成員資格將停用 ADMIN 選項。

ADMIN role_name

ADMIN 子句具有與 ROLE 相同的效果,但指定的角色會新增為新角色的成員,並啟用 ADMIN,使他們有權將新角色的成員資格授予其他人。

SYSID uid

SYSID 子句被忽略,但為了向後相容性而被接受。

備註

使用 ALTER ROLE 變更角色的屬性,並使用 DROP ROLE 移除角色。 CREATE ROLE 指定的所有屬性都可以通過稍後的 ALTER ROLE 命令進行修改。

新增和移除用作群組的角色成員的首選方法是使用 GRANTREVOKE

VALID UNTIL 子句僅定義密碼的到期時間,而不是角色本身。 特別是,在使用非基於密碼的身份驗證方法登入時,不會強制執行到期時間。

此處定義的角色屬性是不可繼承的,也就是說,成為具有例如 CREATEDB 的角色的成員將不允許該成員建立新的資料庫,即使成員資格授予具有 INHERIT 選項。 當然,如果成員資格授予具有 SET 選項,則成員角色將能夠 SET ROLE 到 createdb 角色,然後建立一個新的資料庫。

IN ROLEROLEADMIN 子句建立的成員資格授予將執行此命令的角色作為授予者。

由於向後相容性的原因,INHERIT 屬性是預設值:在先前版本的 PostgreSQL 中,使用者始終可以存取他們所屬群組的所有權限。 但是,NOINHERIT 提供更接近 SQL 標準中指定的語義。

PostgreSQL 包含一個程式 createuser,它具有與 CREATE ROLE 相同的功能(實際上,它會呼叫此命令),但可以從命令 shell 執行。

CONNECTION LIMIT 選項僅在大約的情況下強制執行; 如果兩個新的會話在大約同一時間啟動,而該角色只剩一個連線插槽,則兩個會話都可能失敗。 此外,超級使用者永遠不會強制執行該限制。

使用此命令指定未加密的密碼時必須謹慎。 密碼將以明文形式傳輸到伺服器,並且也可能記錄在客戶端的命令歷史記錄或伺服器日誌中。 但是,命令 createuser 會以加密方式傳輸密碼。 此外,psql 包含一個命令 \password,可用於稍後安全地更改密碼。

範例

建立一個可以登入的角色,但不給它密碼

CREATE ROLE jonathan LOGIN;

建立一個帶密碼的角色

CREATE USER davide WITH PASSWORD 'jw8s0F4';

CREATE USERCREATE ROLE 相同,只是它暗示 LOGIN。)

建立一個角色,其密碼在 2004 年底之前有效。在 2005 年經過一秒後,該密碼將不再有效。

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

建立一個可以建立資料庫和管理角色的角色

CREATE ROLE admin WITH CREATEDB CREATEROLE;

相容性

CREATE ROLE 陳述式在 SQL 標準中,但標準僅要求語法

CREATE ROLE name [ WITH ADMIN role_name ]

多個初始管理員,以及 CREATE ROLE 的所有其他選項,都是 PostgreSQL 擴充功能。

SQL 標準定義了使用者和角色的概念,但它將它們視為不同的概念,並將定義使用者的所有命令留給每個資料庫實作來指定。在 PostgreSQL 中,我們選擇將使用者和角色統一為單一種類的實體。因此,角色比標準中具有更多的可選屬性。

SQL 標準指定的行為最接近於將 SQL 標準使用者建立為具有 NOINHERIT 選項的 PostgreSQL 角色,並將 SQL 標準角色建立為具有 INHERIT 選項的 PostgreSQL 角色。

USER 子句的行為與 ROLE 相同,但已被棄用

USER role_name [, ...]

IN GROUP 子句的行為與 IN ROLE 相同,但已被棄用

IN GROUP role_name [, ...]

提交更正

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