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
。
在 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
命令進行修改。
新增和刪除用作組的角色成員的首選方法是使用 GRANT
和 REVOKE
。
VALID UNTIL
子句僅定義密碼的過期時間,而不是角色本身的過期時間。特別是,當使用非密碼身份驗證方法登入時,不會強制執行過期時間。
此處定義的角色屬性是非繼承的,即,成為一個具有(例如)CREATEDB
的角色的成員將不會允許該成員建立新資料庫,即使該成員資格授予具有 INHERIT
選項。當然,如果成員資格授予具有 SET
選項,則成員角色可以 SET ROLE
到 createdb 角色,然後建立新資料庫。
IN ROLE
、ROLE
和 ADMIN
子句建立的成員資格授予將執行此命令的角色作為授予者。
出於向後相容的原因,INHERIT
屬性是預設值:在 PostgreSQL 的先前版本中,使用者始終可以訪問他們是其成員的組的所有特權。然而,NOINHERIT
更接近 SQL 標準中指定的語義。
PostgreSQL 包含一個名為 createuser 的程式,它具有與 CREATE ROLE
相同的功能(實際上,它呼叫此命令),但可以從命令列執行。
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
[, ...]
如果您在文件中看到任何不正確、與您在該特定功能上的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。