CREATE ROLE — 定義新的資料庫角色
CREATE ROLEname
[ [ WITH ]option
[ ... ] ] whereoption
can be: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit
| [ ENCRYPTED ] PASSWORD 'password
' | PASSWORD NULL | VALID UNTIL 'timestamp
' | IN ROLErole_name
[, ...] | ROLErole_name
[, ...] | ADMINrole_name
[, ...] | SYSIDuid
CREATE ROLE
會新增一個新的角色到 PostgreSQL 資料庫叢集。角色是一種可以擁有資料庫物件並具有資料庫權限的實體;角色可以被視為一個「使用者」、一個「群組」,或取決於它如何使用的兩者。有關管理使用者和身份驗證的資訊,請參閱第 21 章和第 20 章。您必須具有 CREATEROLE
權限或是資料庫超級使用者才能使用此指令。
請注意,角色是在資料庫叢集層級定義的,因此在叢集中的所有資料庫中都有效。
在建立角色期間,可以立即將新建立的角色指定為現有角色的成員,並將現有角色指定為新建立角色的成員。啟用哪些初始角色成員資格選項的規則在下面的 IN ROLE
、ROLE
和 ADMIN
子句中描述。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
命令進行修改。
新增和移除用作群組的角色成員的首選方法是使用 GRANT
和 REVOKE
。
VALID UNTIL
子句僅定義密碼的到期時間,而不是角色本身。 特別是,在使用非基於密碼的身份驗證方法登入時,不會強制執行到期時間。
此處定義的角色屬性是不可繼承的,也就是說,成為具有例如 CREATEDB
的角色的成員將不允許該成員建立新的資料庫,即使成員資格授予具有 INHERIT
選項。 當然,如果成員資格授予具有 SET
選項,則成員角色將能夠 SET ROLE
到 createdb 角色,然後建立一個新的資料庫。
IN ROLE
、ROLE
和 ADMIN
子句建立的成員資格授予將執行此命令的角色作為授予者。
由於向後相容性的原因,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 USER
與 CREATE 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 ROLEname
[ WITH ADMINrole_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
[, ...]
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的地方,請使用此表單來報告文件問題。