### [PostgreSQL學習手冊(角色和權限)](http://www.cnblogs.com/stephen-liu74/archive/2012/05/18/2302639.html)
Posted on?2012-05-18 09:08?[Stephen_Liu](http://www.cnblogs.com/stephen-liu74/)?閱讀(1359) 評論(1)?[編輯](http://www.cnblogs.com/stephen-liu74/admin/EditPosts.aspx?postid=2302639)?[收藏](http://www.cnblogs.com/stephen-liu74/archive/2012/05/18/2302639.html#)?
??? PostgreSQL是通過角色來管理數據庫訪問權限的,我們可以將一個角色看成是一個數據庫用戶,或者一組數據庫用戶。角色可以擁有數據庫對象,如表、索引,也可以把這些對象上的權限賦予其它角色,以控制哪些用戶對哪些對象擁有哪些權限。
????
**一、數據庫角色:**
?? ?1. 創建角色:
?? ?**CREATE ROLE**?role_name;
?? ?
?? ?2. 刪除角色:
?? ?**DROP ROLE**?role_name;
?? ?
?? ?3. 查詢角色:
?? ?檢查系統表pg_role,如:
?? ?SELECT usename FROM?**pg_role**;
?? ?也可以在psql中執行\du命令列出所有角色。
?? ?
**二、角色屬性:**
?? ?一個數據庫角色可以有一系列屬性,這些屬性定義他的權限,以及與客戶認證系統的交互。
?? ?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**;
?? ?
**三、權限:**
?? ?數據庫對象在被創建時都會被賦予一個所有者,通常而言,所有者就是執行對象創建語句的角色。對于大多數類型的對象,其初始狀態是只有所有者(或超級用戶)可以對該對象做任何事情。如果要允許其它用戶可以使用該對象,必須賦予適當的權限。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)。
**四、角色成員:**
?? ?在系統的用戶管理中,通常會把多個用戶賦予一個組,這樣在設置權限時只需給該組設置即可,撤銷權限時也是從該組撤消。在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**命令即可。然而在刪除該組角色之后,它與其成員角色之間的關系將被立即撤銷(成員角色本身不會受影響)。不過需要注意的是,在刪除之前,任何屬于該組角色的對象都必須先被刪除或者將對象的所有者賦予其它角色,與此同時,任何賦予該組角色的權限也都必須被撤消。
分類:?[PostgreSQL](http://www.cnblogs.com/stephen-liu74/category/343171.html)
- 數據表
- 模式Schema
- 表的繼承和分區
- 常用數據類型
- 函數和操作符-一
- 函數和操作符-二
- 函數和操作符-三
- 索引
- 事物隔離
- 性能提升技巧
- 服務器配置
- 角色和權限
- 數據庫管理
- 數據庫維護
- 系統表
- 系統視圖
- SQL語言函數
- PL-pgSQL過程語言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的時間-日期函數使用
- PostgreSQL 查看數據庫,索引,表,表空間大小
- 用以查詢某表的詳細 包含表字段的注釋信息
- PostgreSQL 系統表查看系統信息
- postgre存儲過程簡單實用方法
- PostgreSQL實用日常維護SQL
- PostgreSQL的時間函數使用整理
- 命令
- pg_ctl控制服務器
- initdb 初始化數據庫簇
- createdb創建數據庫
- dropdb 刪除數據庫
- createuser創建用戶
- dropuser 刪除用戶
- psql交互式工具
- psql命令手冊
- pg_dump 數據庫轉儲
- pg_restore恢復數據庫
- vacuumdb 清理優化數據庫
- reindexdb 數據庫重創索引
- createlang 安裝過程語言
- droplang 刪除過程語言
- pg_upgrade 升級數據庫簇
- 調試存儲過程
- 客戶端命令-一
- 客戶端命令-二
- 使用技巧
- PostgreSQL刪除重復數據
- postgresql 小技巧
- PostgreSQL的10進制與16進制互轉
- PostgreSQL的漢字轉拼音
- Postgres重復數據的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函數內返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL數據庫切割和組合字段函數
- postgresql重復數據的刪除
- PostgreSQL的遞歸查詢(with recursive)
- PostgreSQL函數如何返回數據集
- PostgreSQL分區表(Table Partitioning)應用 - David_Tang - 博客園
- PostgreSQL: function 返回結果集多列和單列的例子
- 利用pgAgent創建定時任務
- 淺談 PostgreSQL 類型轉換類似Oracle
- postgresql在windows(包括win7)下的安裝配置
- PostgreSQL簡介、安裝、用戶管理、啟動關閉、創建刪除數據庫 (2010-11-08 12-52-51)轉載▼標簽: 雜談分類: PostgreSQL
- PostgreSQL的generate_series函數應用
- PostgreSQL 8.3.1 全文檢索(Full Text Search)
- postgresql record 使用
- 備份恢復
- PostgreSQL基于時間點恢復(PITR)
- Postgresql基于時間點恢復PITR案例(二)
- Postgres邏輯備份腳本
- Postgres invalid command \N數據恢復處理