首頁 > 軟體

pgsql之create user與create role的區別介紹

2021-01-16 12:00:03

create user的語法

CREATE USER name [ [ WITH ] option [ ... ] ] 
where option can be: 
  SUPERUSER | NOSUPERUSER
 | CREATEDB | NOCREATEDB
 | CREATEROLE | NOCREATEROLE
 | CREATEUSER | NOCREATEUSER
 | INHERIT | NOINHERIT
 | LOGIN | NOLOGIN
 | REPLICATION | NOREPLICATION
 | BYPASSRLS | NOBYPASSRLS
 | CONNECTION LIMIT connlimit
 | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
 | VALID UNTIL 'timestamp'
 | IN ROLE role_name [, ...]
 | IN GROUP role_name [, ...]
 | ROLE role_name [, ...]
 | ADMIN role_name [, ...]
 | USER role_name [, ...]
 | SYSID uid

例如:

create user test with replication createrole createdb login password 'test123';

with 後面的部分描述的是「系統許可權」或者資料庫使用者的屬性。使用du命令檢視,則對應著List of roles Attributes列。如圖:

create user與create role的區別

官網上的描述是:

CREATE USER is now an alias for CREATE ROLE. The only difference is that when the command is spelled CREATE USER, LOGIN is assumed by default, whereas NOLOGIN is assumed when the command is spelled CREATE ROLE.

也就是說create user 預設有login許可權,而create role沒有。

補充:關於PostgreSQL資料庫中的表空間,user,role,許可權,模式(schema)的概念.

表空間:

在PG中,表空間是檔案系統中位置的一個連結,也就是一個目錄.

表空間是一個可以儲存所有其他物件的容器,如表,索引等.

在很多情況下,這樣的功能是很有用的.也就是說:在一個指定的位置儲存資料,而不是在預設的位置.

存在如下一個場景:當我們用完初始化資料庫叢集所使用的分割區上的空間時,就可以使用表空間.

另外一個適用的場景是:處於效能考慮,移動具體物件到速度不同的磁碟上.

可以在一個比較快磁碟的表空間上建立一組頻繁存取的物件.

或者是,在比較快的磁碟上使用OLTP業務,在比較慢的磁碟上執行OLAP業務.

當我們初始化一個叢集的時候,可以得到兩個預設表空間,

一個表空間成為pg_default,所有使用者建立的並且未指定一個表空間的物件講在pg_default表空間內被建立.

pg_default表空間的位置PGDATA下的基礎目錄.

另一個表空間是pg_global,它持有叢集(cluster)中所有資料庫共用的系統表.

模式:

模式(schema):我們在pg資料庫中建立的任何物件(表,索引,檢視等)都會在一個模式下被建立.

當建立物件時,如果未指定模式,這些物件將會在預設的模式下被建立.這個模式叫做public.

一個例外情況是另一個模式首先出現在search_path中.

角色和許可權

在pg中,一個角色幾乎與一個使用者相同.因為一個角色可以是使用者,也可以是一個使用者組.

create user命令等同於create role,除了一點:create user有隱含的login許可權.而create role不會有該許可權.

每個角色是整個cluster所共用的,角色不是某個資料庫特有的.

為了在資料庫實現有效操作,使用者必須獲得相關許可權.

在pg中,許可權可以針對資料庫級別設定,也可以針對單個物件級別(表,檢視,函數等)進行設定.

許可權有select,delete,update,insert,execute

還有建立物件的許可權,刪除物件的許可權

在pg中,可以把一個特定許可權給一個user

也可以把一個特定許可權給一個role

role的一個重要特點就是可以被繼承.

舉例:

我們可以建立一個report_user角色,然後在一組table中將select許可權授予這個角色.

然後,為從事報告工作的每個人各自建立user,並將report_user 角色授權給這些user.

當其中一個user離開部門時,我們只要刪除該使用者所建立的登入即可.

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。如有錯誤或未考慮完全的地方,望不吝賜教。


IT145.com E-mail:sddin#qq.com