PostgreSQL CREATE ROLE

2021-09-09 11:52 更新

CREATE ROLE — 定義一個新的數據庫角色

大綱

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

描述

CREATE ROLEPostgreSQL數據庫集簇增加一個新的角色。一個角色是一個實體,它可以擁有數據庫對象并且擁有數據庫特權。根據一個角色如何被使用,它可以被考慮成一個用戶、一個或者兩者。有關管理用戶和認證的信息可以參考 第 21 章第 20 章。要使用這個命令,你必須具有CREATEROLE特權或者成為一個數據庫超級用戶。

注意角色是定義在數據庫集簇層面上的,并且因此在集簇中的所有數據庫中都可用。

參數

name

新角色的名稱。

SUPERUSER
NOSUPERUSER

這些子句決定新角色是否是一個超級用戶,它可以越過數據庫內的所有訪問限制。超級用戶狀態(tài)很危險并且只應該在確實需要時才用。要創(chuàng)建一個新超級用戶,你必須自己是一個超級用戶。如果沒有指定,默認值是NOSUPERUSER。

CREATEDB
NOCREATEDB

這些子句定義一個角色創(chuàng)建數據庫的能力。如果指定了CREATEDB,被定義的角色將被允許創(chuàng)建新的數據庫。指定NOCREATEDB將否定一個角色創(chuàng)建數據庫的能力。如果沒有指定,默認值是NOCREATEDB。

CREATEROLE
NOCREATEROLE

這些子句決定一個角色是否被允許創(chuàng)建新的角色(也就是執(zhí)行CREATE ROLE)。一個帶有CREATEROLE特權的角色也能修改和刪除其他角色。如果沒有指定,默認值是NOCREATEROLE。

INHERIT
NOINHERIT

如果新的角色是其他角色的成員,這些子句決定新角色是否從那些角色中繼承特權,把新角色作為成員的角色稱為新角色的父角色。一個帶有INHERIT屬性的角色能夠自動使用已經被授予給其直接或間接父角色的任何數據庫特權。如果沒有INHERIT,在另一個角色中的成員關系只會把 SET ROLE的能力授予給那個其他角色,只有在這樣做后那個其他角色的特權才可用。如果沒有指定,默認值是INHERIT。

LOGIN
NOLOGIN

這些子句決定一個角色是否被允許登錄,也就是在客戶端連接期間該角色是否能被給定為初始會話認證名稱。一個具有LOGIN屬性的角色可以被考慮為一個用戶。沒有這個屬性的角色對于管理數據庫特權很有用,但是卻不是用戶這個詞的通常意義。如果沒有指定,默認值是NOLOGIN,不過當CREATE ROLE被通過CREATE USER調用時默認值會是LOGIN

REPLICATION
NOREPLICATION

這些子句決定一個角色是否為復制角色。角色必須具有這個屬性(或者成為一個超級用戶)才能以復制模式(物理復制或者邏輯復制)連接到服務器以及創(chuàng)建或者刪除復制槽。一個具有REPLICATION屬性的角色是一個具有非常高特權的角色,并且只應被用于確實需要復制的角色上。如果沒有指定,默認值是NOREPLICATION。 您必須是超級用戶才能創(chuàng)建具有REPLICATION屬性的新角色。

BYPASSRLS
NOBYPASSRLS

這些子句決定是否一個角色可以繞過每一條行級安全性(RLS)策略。 默認是NOBYPASSRLS。 您必須是超級用戶才能創(chuàng)建具有BYPASSRLS屬性的新角色。

注意 pg_dump 將默認把row_security設置為OFF, 以確保一個表的所有內容被轉儲出來。如果運行 pg_dump 的用戶不具有適當的權限,將會返回一個錯誤。 但是,超級用戶和被轉儲表的擁有者總是可以繞過 RLS。

CONNECTION LIMIT connlimit

如果角色能登錄,這指定該角色能建立多少并發(fā)連接。-1(默認值)表示無限制。注意這個限制僅針對于普通連接。預備事務和后臺工作者連接都不受這一限制管轄。

[ ENCRYPTED ] PASSWORD 'password'
PASSWORD NULL

設置角色的口令(口令只對具有LOGIN屬性的角色有用,但是不管怎樣你還是可以為沒有該屬性的角色定義一個口令)。如果你沒有計劃使用口令認證,你可以忽略這個選項。如果沒有指定口令,口令將被設置為空并且該用戶的口令認證總是會失敗。也可以用PASSWORD NULL顯式地寫出一個空口令。

注意

指定一個空字符串也將把口令設置為空,但是在PostgreSQL版本10之前是不能這樣做的。在早期的版本中,是否可以使用空字符串取決于認證方法和確切的版本,而libpq在任何情況下都將拒絕使用空字符串。為了避免混淆,應該避免指定空字符串。

口令總是以加密的方式存放在系統(tǒng)目錄中。ENCRYPTED關鍵詞沒有實際效果,它只是為了向后兼容性而存在。加密的方法由配置參數password_encryption決定。如果當前的口令字符串已經是MD5加密或者SCRAM加密的格式,那么不管password_encryption的值是什么,口令字符串還是原樣存儲(因為系統(tǒng)無法解密以不同格式加密的口令字符串)。這種方式允許在轉儲/恢復時重載加密的口令。

VALID UNTIL 'timestamp'

VALID UNTIL機制設置一個日期和時間,在該時間點之后角色的口令將會失效。如果這個子句被忽略,那么口令將總是有效。

IN ROLE role_name

IN ROLE子句列出一個或多個現有的角色,新角色將被立即作為新成員加入到這些角色中(注意沒有選項可以把新角色作為一個管理員加入,需要用一個單獨的GRANT命令來完成)。

IN GROUP role_name

IN GROUPIN 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命令所修改。

增加和移除組角色成員的最佳方式是使用GRANTREVOKE。

VALID UNTIL子句只為一個口令而不是為一個角色本身定義了一個過期時間。特別地,當使用一個非基于口令認證的方法登錄時,過期時間是不會被強制的。

INHERIT屬性管理可授予特權(也就是對數據庫對象和角色成員關系的訪問特權)的繼承性。它并不適用于由CREATE ROLEALTER ROLE設置的特殊角色屬性。例如,作為具有CREATEDB特權的角色的一個成員,并不會立刻授予創(chuàng)建數據庫的角色,即便INHERIT被設置也是如此,在創(chuàng)建一個數據庫之前必須通過 SET ROLE 成為該角色。

INHERIT屬性是用于向后兼容原因的默認值:在早前的PostgreSQL發(fā)布中,用戶總是能夠訪問其所屬組的所有特權。不過,NOINHERIT更加接近于 SQL 標準中指定的語義。

要小心CREATEROLE特權。對于一個CREATEROLE角色的特權沒有繼承的概念。那意味著即使一個角色沒有特定的特權但被允許創(chuàng)建其他角色,它可以輕易地創(chuàng)建與自身特權不同的另一個角色(除了創(chuàng)建具有超級用戶特權的角色)。例如,如果角色user具有CREATEROLE特權但是沒有 CREATEDB特權,但是它能夠創(chuàng)建一個帶有CREATEDB特權的新角色。因此,可以把具有CREATEROLE特權的角色看成是準超級用戶角色。

PostgreSQL包括一個程序createuser,它具有和CREATE ROLE相同的功能(事實上,它會調用這個命令),但是它可以從命令 shell 中運行。

CONNECTION LIMIT只被近似地強制,如果兩個新會話在幾乎相同時間被開始,而此時該角色只剩下剛好一個連接,兩者可能都將失敗。還有,該限制從不對超級用戶強制。

用這個命令指定一個非加密口令時必須加以注意。該命令將被以明文的形式傳輸到服務器,并且它也可能被記錄在客戶端命令歷史或者服務器日志中。不過,命令createuser會傳輸加密的口令。還有,psql包含一個命令\password,它可以被用來安全地改變該口令。

例子

創(chuàng)建一個能登錄但是沒有口令的角色:

CREATE ROLE jonathan LOGIN;

創(chuàng)建一個有口令的角色:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

CREATE USERCREATE ROLE完全相同,除了它帶有LOGIN)。

創(chuàng)建一個角色,它的口令有效期截止到 2004 年底。在進入 2005 年第一秒時,該口令會失效。

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

創(chuàng)建一個能夠創(chuàng)建數據庫并且管理角色的角色:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

兼容性

SQL 標準中有CREATE ROLE語句,但是標準只要求語法

CREATE ROLE name [ WITH ADMIN role_name ]

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

SQL 標準定義了用戶和角色的概念,但是它把它們看成是可區(qū)分的概念并且將定義用戶的所有命令留給每一種數據庫實現來指定。在PostgreSQL中,我們已經選擇把用戶和角色統(tǒng)一成一種單一實體類型。因此角色比起標準中擁有更多可選的屬性。

SQL 標準指定的行為可以通過給用戶NOINHERIT屬性來得到最大的金絲,而角色會被給予INHERIT屬性。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號