2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前18)/ 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 ROLEPostgreSQL 資料庫叢集新增一個新角色。角色是擁有資料庫物件和擁有資料庫許可權的實體;一個角色可以被視為一個使用者、一個,或者兩者兼有,具體取決於其使用方式。有關管理使用者和身份驗證的資訊,請參閱第 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

PostgreSQL 16 之前的版本中,繼承是角色級別的屬性,控制該角色的所有執行時成員資格檢查。

LOGIN
NOLOGIN

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

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,並且該使用者始終會密碼身份驗證失敗。null 密碼也可以透過 PASSWORD NULL 顯式寫入。

注意

指定空字串也將把密碼設定為 null,但這在 PostgreSQL 10 版本之前並非如此。在早期版本中,可以根據身份驗證方法和確切版本使用空字串,libpq 無論如何都會拒絕使用它。為避免歧義,應避免使用空字串。

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

警告

MD5 加密密碼的支援已棄用,將在 PostgreSQL 的未來版本中移除。有關遷移到其他密碼型別的詳細資訊,請參閱第 20.5 節

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 相同的功能(實際上,它呼叫此命令),但可以從命令列執行。

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 [, ...]

提交更正

如果您在文件中看到任何不正確、與您在該特定功能上的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。