CREATE ROLE用於向PolarDB資料庫叢集增加一個新的角色。
簡介
CREATE ROLE向PolarDB資料庫叢集增加一個新的角色。一個角色是一個實體,它可以擁有資料庫物件並且擁有資料庫特權。根據一個角色如何被使用,它可以被考慮成一個“使用者”、一個“組”或者兩者。要使用這個命令,你必須具有CREATEROLE特權或者成為一個資料庫超級使用者。
角色是定義在資料庫叢集層面上的,並且因此在叢集中的所有資料庫中都可用。
文法
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option可以是:
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 [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid參數
name新角色的名稱。
SUPERUSER NOSUPERUSER這些子句決定新角色是否是一個“超級使用者”,它可以越過資料庫內的所有訪問限制。超級使用者狀態很危險並且只應該在確實需要時才用。要建立一個新超級使用者,你必須自己是一個超級使用者。如果沒有指定,預設值是NOSUPERUSER。
CREATEDB NOCREATEDB這些子句定義一個角色建立資料庫的能力。如果指定了CREATEDB,被定義的角色將被允許建立新的資料庫。指定NOCREATEDB將否定一個角色建立資料庫的能力。如果沒有指定,預設值是NOCREATEDB。
CREATEROLE NOCREATEROLE這些子句決定一個角色是否被允許建立新的角色(也就是執行CREATE ROLE)。一個帶有CREATEROLE特權的角色也能修改和刪除其他角色。如果沒有指定,預設值是NOCREATEROLE。
INHERIT NOINHERIT如果新的角色是其他角色的成員,這些子句決定新角色是否從那些角色中“繼承”特權,把新角色作為成員的角色稱為新角色的父角色。一個帶有INHERIT屬性的角色能夠自動使用已經被授予給其直接或間接父角色的任何資料庫特權。如果沒有INHERIT,在另一個角色中的成員關係只會把SET ROLE的能力授予給那個其他角色,只有在這樣做後那個其他角色的特權才可用。如果沒有指定,預設值是INHERIT。
LOGIN NOLOGIN這些子句決定一個角色是否被允許登入,也就是在用戶端串連期間該角色是否能被給定為初始會話認證名稱。一個具有LOGIN屬性的角色可以被考慮為一個使用者。沒有這個屬性的角色對於管理資料庫特權很有用,但是卻不是使用者這個詞的通常意義。如果沒有指定,預設值是NOLOGIN,不過當CREATE ROLE被通過 CREATE USER 調用時預設值會是LOGIN。
REPLICATION NOREPLICATION這些子句決定一個角色是否為複製角色。角色必須具有這個屬性(或者成為一個超級使用者)才能以複製模式(物理複製或者邏輯複製)串連到伺服器以及建立或者刪除複製槽。一個具有REPLICATION屬性的角色是一個具有非常高特權的角色,並且只應被用於確實需要複製的角色上。如果沒有指定,預設值是NOREPLICATION。 您必須是超級使用者才能建立具有REPLICATION屬性的新角色。
BYPASSRLS NOBYPASSRLS這些子句決定是否一個角色可以繞過每一條行級安全性(RLS)策略。 預設是NOBYPASSRLS。 您必須是超級使用者才能建立具有BYPASSRLS屬性的新角色。
pg_dump 將預設把row_security設定為OFF, 以確保一個表的所有內容被轉儲出來。如果運行 pg_dump 的使用者不具有適當的許可權,將會返回一個錯誤。 但是,超級使用者和被轉儲表的擁有者總是可以繞過 RLS。
CONNECTION LIMIT connlimit如果角色能登入,這指定該角色能建立多少並發串連。-1(預設值)表示無限制。注意這個限制僅針對於普通串連。預備事務和後台工作者串連都不受這一限制管轄。
[ ENCRYPTED ] PASSWORD ' password'
PASSWORD NULL設定角色的口令(口令只對具有LOGIN屬性的角色有用,但是不管怎樣你還是可以為沒有該屬性的角色定義一個口令)。如果你沒有計劃使用口令認證,你可以忽略這個選項。如果沒有指定口令,口令將被設定為空白並且該使用者的口令認證總是會失敗。也可以用PASSWORD NULL顯式地寫出一個空口令。
說明
指定一個Null 字元串也將把口令設定為空白。
口令總是以加密的方式存放在系統目錄中。ENCRYPTED關鍵詞沒有實際效果,它只是為了向後相容性而存在。加密的方法由配置參數 password_encryption 決定。如果當前的口令字串已經是 MD5 加密或者 SCRAM 加密的格式,那麼不管password_encryption的值是什麼,口令字串還是原樣儲存(因為系統無法解密以不同格式加密的口令字串)。這種方式允許在轉儲/恢複時重載加密的口令。
VALID UNTIL ' timestamp'VALID UNTIL機制設定一個日期和時間,在該時間點之后角色的口令將會失效。如果這個子句被忽略,那麼口令將總是有效。
IN ROLE role_name IN ROLE子句列出一個或多個現有的角色,新角色將被立即作為新成員加入到這些角色中(注意沒有選項可以把新角色作為一個管理員加入,需要用一個單獨的GRANT命令來完成)。
IN GROUP role_name IN GROUP是IN ROLE的一種已廢棄的拼字方式。
ROLE role_name ROLE子句列出一個或者多個現有角色,它們會被自動作為成員加入到新角色中(這實際上新角色變成了一個“組”)。
ADMIN role_name ADMIN子句與ROLE相似,但是被提及的角色被使用WITH ADMIN OPTION加入到新角色中,讓它們能夠把這個角色中的成員關係授予給其他人。
USER role_name USER子句是ROLE子句的一個已廢棄的拼字方式。
SYSID uid SYSID子句會被忽略,但是會為了向後相容,還是會接受它。
使用 ALTER ROLE 來更改一個角色的屬性,以及使用 DROP ROLE 來移除一個角色。所有用CREATE ROLE指定的屬性可以被後來的ALTER ROLE命令所修改。
增加和移除組角色成員的最佳方式是使用 GRANT 和 REVOKE。
VALID UNTIL子句只為一個口令而不是為一個角色本身定義了一個到期時間。特別地,當使用一個非基於口令認證的方法登入時,到期時間是不會被強制的。
INHERIT屬性管理可授予特權(也就是對資料庫物件和角色成員關係的存取權限)的繼承性。它並不適用於由CREATE ROLE和ALTER ROLE設定的特殊角色屬性。例如,作為具有CREATEDB特權的角色的一個成員,並不會立刻授予建立資料庫的角色,即便INHERIT被設定也是如此,在建立一個資料庫之前必須通過 SET ROLE 成為該角色。
INHERIT屬性是用於向後相容原因的預設值:在早前的PolarDB發布中,使用者總是能夠訪問其所屬組的所有特權。不過,NOINHERIT更加接近於 SQL 標準中指定的語義。
要小心CREATEROLE特權。對於一個CREATEROLE角色的特權沒有繼承的概念。那意味著即使一個角色沒有特定的特權但被允許建立其他角色,它可以輕易地建立與自身特權不同的另一個角色(除了建立具有超級使用者特權的角色)。例如,如果角色“user”具有CREATEROLE特權但是沒有CREATEDB特權,但是它能夠建立一個帶有CREATEDB特權的新角色。因此,可以把具有CREATEROLE特權的角色看成是准超級使用者角色。
PolarDB包括一個程式 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;