PostgreSQL是經過角色來管理數據庫訪問權限的,咱們能夠將一個角色當作是一個數據庫用戶,或者一組數據庫用戶。角色能夠擁有數據庫對象,如表、索引,也能夠把這些對象上的權限賦予其它角色,以控制哪些用戶對哪些對象擁有哪些權限。
1、數據庫角色:
1. 建立角色:
CREATE ROLE role_name;
2. 刪除角色:
DROP ROLE role_name;
3. 查詢角色:
檢查系統表pg_roles,如:
SELECT rolname FROM pg_roles;
也能夠在psql中執行\du命令列出全部角色。
2、角色屬性:
一個數據庫角色能夠有一系列屬性,這些屬性定義他的權限,以及與客戶認證系統的交互。
1. 登陸權限:
只有具備LOGIN屬性的角色才能夠用於數據庫鏈接,所以咱們能夠將具備該屬性的角色視爲登陸用戶,建立方法有以下兩種:
CREATE ROLE name LOGIN PASSWORD '123456‘;
CREATE USER name PASSWORD '123456';
2. 超級用戶:
數據庫的超級用戶擁有該數據庫的全部權限,爲了安全起見,咱們最好使用非超級用戶完成咱們的正常工做。和建立普通用戶不一樣,建立超級用戶必須是以超級用戶的身份執行如下命令:
CREATE ROLE name
SUPERUSER
;
3. 建立數據庫:
角色要想建立數據庫,必須明確賦予建立數據庫的屬性,見以下命令:
CREATE ROLE name CREATEDB;
4. 建立角色:
一個角色要想建立更多角色,必須明確給予建立角色的屬性,見以下命令:
CREATE ROLE name
CREATEROLE
;
3、權限:
數據庫對象在被建立時都會被賦予一個全部者,一般而言,全部者就是執行對象建立語句的角色。對於大多數類型的對象,其初始狀態是隻有全部者(或超級用戶)能夠對該對象作任何事情。若是要容許其它用戶可使用該對象,必須賦予適當的權限。PostgreSQL中預約義了許多不一樣類型的內置權限,如:
SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
咱們可使用GRANT命令來賦予權限,如:
GRANT UPDATE ON accounts TO joe;
對於上面的命令,其含義爲將accounts表的update權限賦予joe角色。此外,咱們也能夠用特殊的名字PUBLIC把對象的權限賦予系統中的全部角色。在權限聲明的位置上寫ALL,表示把適用於該對象的全部權限都賦予目標角色。
要撤銷權限,使用合適的REVOKE命令:
REVOKE ALL ON accounts FROM PUBLIC;
其含義爲:對全部角色(PUBLIC)撤銷在accounts對象上的全部權限(ALL)。
4、角色成員:
在系統的用戶管理中,一般會把多個用戶賦予一個組,這樣在設置權限時只需給該組設置便可,撤銷權限時也是從該組撤消。在PostgreSQL中,首先須要建立一個表明組的角色,以後再將該角色的membership權限賦給獨立的用戶角色便可。
1. 建立一個組角色,一般而言,該角色不該該具備LOGIN屬性,如:
CREATE ROLE name;
2. 使用GRANT和REVOKE命令添加和撤消權限:
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
一個角色成員能夠經過兩種方法使用組角色的權限,如:
1. 每一個組成員均可以用SET ROLE命令將本身臨時"變成"該組成員,此後再建立的任何對象的全部者將屬於該組,而不是原有的登陸用戶。
2. 擁有INHERIT屬性的角色成員自動繼承它們所屬角色的權限。
見以下示例:
CREATE ROLE joe LOGIN INHERIT; --INHERIT是缺省屬性。
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
如今咱們以角色joe的身份與數據庫創建鏈接,那麼該數據庫會話將同時擁有角色joe和角色admin的權限,這是由於joe"繼承 (INHERIT)"了admin的權限。然而與此不一樣的是,賦予wheel角色的權限在該會話中將不可用,由於joe角色只是wheel角色的一個間接成員,它是經過admin角色間接傳遞過來的,而admin角色卻含有NOINHERIT屬性,這樣wheel角色的權限將沒法被joe繼承。
這樣wheel角色的權限將沒法被joe繼承。此時,咱們能夠在該會話中執行下面的命令:
SET ROLE admin;
在執行以後,該會話將只擁有admin角色的權限,而再也不包括賦予joe角色的權限。一樣,在執行下面的命令以後,該會話只能使用賦予wheel的權限。
SET ROLE wheel;
在執行一段時間以後,若是仍然但願將該會話恢復爲原有權限,可使用下列恢復方式之一:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
注意: SET ROLE命令老是容許選取當前登陸角色的直接或間接組角色。所以,在變爲wheel以前不必先變成admin。
角色屬性LOGIN、SUPERUSER和CREATEROLE被視爲特殊權限,它們不會像其它數據庫對象的普通權限那樣被繼承。若是須要,必須在調用SET ROLE時顯式指定擁有該屬性的角色。好比,咱們也能夠給admin角色賦予CREATEDB和CREATEROLE權限,而後再以joe的角色鏈接數據庫,此時該會話不會當即擁有這些特殊權限,只有當執行SET ROLE admin命令以後當前會話才具備這些權限。
要刪除一個組角色,執行DROP ROLE group_role命令便可。然而在刪除該組角色以後,它與其成員角色之間的關係將被當即撤銷(成員角色自己不會受影響)。不過須要注意的是,在刪除以前,任何屬於該組角色的對象都必須先被刪除或者將對象的全部者賦予其它角色,與此同時,任何賦予該組角色的權限也都必須被撤消。 sql