PostgreSQL教程(十二):角色和權(quán)限管理介紹
PostgreSQL是通過角色來管理數(shù)據(jù)庫訪問權(quán)限的,我們可以將一個(gè)角色看成是一個(gè)數(shù)據(jù)庫用戶,或者一組數(shù)據(jù)庫用戶。角色可以擁有數(shù)據(jù)庫對(duì)象,如表、索引,也可以把這些對(duì)象上的權(quán)限賦予其它角色,以控制哪些用戶對(duì)哪些對(duì)象擁有哪些權(quán)限。
一、數(shù)據(jù)庫角色:
1. 創(chuàng)建角色:
CREATE ROLE role_name;
2. 刪除角色:
DROP ROLE role_name;
3. 查詢角色:
檢查系統(tǒng)表pg_role,如:
SELECT usename FROM pg_role;
也可以在psql中執(zhí)行\(zhòng)du命令列出所有角色。
二、角色屬性:
一個(gè)數(shù)據(jù)庫角色可以有一系列屬性,這些屬性定義他的權(quán)限,以及與客戶認(rèn)證系統(tǒng)的交互。
1. 登錄權(quán)限:
只有具有LOGIN屬性的角色才可以用于數(shù)據(jù)庫連接,因此我們可以將具有該屬性的角色視為登錄用戶,創(chuàng)建方法有如下兩種:
CREATE ROLE name LOGIN PASSWORD '123456‘;
CREATE USER name PASSWORD '123456';
2. 超級(jí)用戶:
數(shù)據(jù)庫的超級(jí)用戶擁有該數(shù)據(jù)庫的所有權(quán)限,為了安全起見,我們最好使用非超級(jí)用戶完成我們的正常工作。和創(chuàng)建普通用戶不同,創(chuàng)建超級(jí)用戶必須是以超級(jí)用戶的身份執(zhí)行以下命令:
CREATE ROLE name SUPERUSER;
3. 創(chuàng)建數(shù)據(jù)庫:
角色要想創(chuàng)建數(shù)據(jù)庫,必須明確賦予創(chuàng)建數(shù)據(jù)庫的屬性,見如下命令:
CREATE ROLE name CREATEDB;
4. 創(chuàng)建角色:
一個(gè)角色要想創(chuàng)建更多角色,必須明確給予創(chuàng)建角色的屬性,見如下命令:
CREATE ROLE name CREATEROLE;
三、權(quán)限:
數(shù)據(jù)庫對(duì)象在被創(chuàng)建時(shí)都會(huì)被賦予一個(gè)所有者,通常而言,所有者就是執(zhí)行對(duì)象創(chuàng)建語句的角色。對(duì)于大多數(shù)類型的對(duì)象,其初始狀態(tài)是只有所有者(或超級(jí)用戶)可以對(duì)該對(duì)象做任何事情。如果要允許其它用戶可以使用該對(duì)象,必須賦予適當(dāng)?shù)臋?quán)限。PostgreSQL中預(yù)定義了許多不同類型的內(nèi)置權(quán)限,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
我們可以使用GRANT命令來賦予權(quán)限,如:
GRANT UPDATE ON accounts TO joe;
對(duì)于上面的命令,其含義為將accounts表的update權(quán)限賦予joe角色。此外,我們也可以用特殊的名字PUBLIC把對(duì)象的權(quán)限賦予系統(tǒng)中的所有角色。在權(quán)限聲明的位置上寫ALL,表示把適用于該對(duì)象的所有權(quán)限都賦予目標(biāo)角色。
要撤銷權(quán)限,使用合適的REVOKE命令:
REVOKE ALL ON accounts FROM PUBLIC;
其含義為:對(duì)所有角色(PUBLIC)撤銷在accounts對(duì)象上的所有權(quán)限(ALL)。
四、角色成員:
在系統(tǒng)的用戶管理中,通常會(huì)把多個(gè)用戶賦予一個(gè)組,這樣在設(shè)置權(quán)限時(shí)只需給該組設(shè)置即可,撤銷權(quán)限時(shí)也是從該組撤消。在PostgreSQL中,首先需要?jiǎng)?chuàng)建一個(gè)代表組的角色,之后再將該角色的membership權(quán)限賦給獨(dú)立的用戶角色即可。
1. 創(chuàng)建一個(gè)組角色,通常而言,該角色不應(yīng)該具有LOGIN屬性,如:
CREATE ROLE name;
2. 使用GRANT和REVOKE命令添加和撤消權(quán)限:
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
一個(gè)角色成員可以通過兩種方法使用組角色的權(quán)限,如:
1. 每個(gè)組成員都可以用SET ROLE命令將自己臨時(shí)"變成"該組成員,此后再創(chuàng)建的任何對(duì)象的所有者將屬于該組,而不是原有的登錄用戶。
2. 擁有INHERIT屬性的角色成員自動(dòng)繼承它們所屬角色的權(quán)限。
見如下示例:
CREATE ROLE joe LOGIN INHERIT; --INHERIT是缺省屬性。
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
現(xiàn)在我們以角色joe的身份與數(shù)據(jù)庫建立連接,那么該數(shù)據(jù)庫會(huì)話將同時(shí)擁有角色joe和角色admin的權(quán)限,這是因?yàn)閖oe"繼承(INHERIT)"了admin的權(quán)限。然而與此不同的是,賦予wheel角色的權(quán)限在該會(huì)話中將不可用,因?yàn)閖oe角色只是wheel角色的一個(gè)間接成員,它是通過admin角色間接傳遞過來的,而admin角色卻含有NOINHERIT屬性,這樣wheel角色的權(quán)限將無法被joe繼承。
這樣wheel角色的權(quán)限將無法被joe繼承。此時(shí),我們可以在該會(huì)話中執(zhí)行下面的命令:
SET ROLE admin;
在執(zhí)行之后,該會(huì)話將只擁有admin角色的權(quán)限,而不再包括賦予joe角色的權(quán)限。同樣,在執(zhí)行下面的命令之后,該會(huì)話只能使用賦予wheel的權(quán)限。
SET ROLE wheel;
在執(zhí)行一段時(shí)間之后,如果仍然希望將該會(huì)話恢復(fù)為原有權(quán)限,可以使用下列恢復(fù)方式之一:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
注意: SET ROLE命令總是允許選取當(dāng)前登錄角色的直接或間接組角色。因此,在變?yōu)閣heel之前沒必要先變成admin。
角色屬性LOGIN、SUPERUSER和CREATEROLE被視為特殊權(quán)限,它們不會(huì)像其它數(shù)據(jù)庫對(duì)象的普通權(quán)限那樣被繼承。如果需要,必須在調(diào)用SET ROLE時(shí)顯示指定擁有該屬性的角色。比如,我們也可以給admin角色賦予CREATEDB和CREATEROLE權(quán)限,然后再以joe的角色連接數(shù)據(jù)庫,此時(shí)該會(huì)話不會(huì)立即擁有這些特殊權(quán)限,只有當(dāng)執(zhí)行SET ROLE admin命令之后當(dāng)前會(huì)話才具有這些權(quán)限。
要?jiǎng)h除一個(gè)組角色,執(zhí)行DROP ROLE group_role命令即可。然而在刪除該組角色之后,它與其成員角色之間的關(guān)系將被立即撤銷(成員角色本身不會(huì)受影響)。不過需要注意的是,在刪除之前,任何屬于該組角色的對(duì)象都必須先被刪除或者將對(duì)象的所有者賦予其它角色,與此同時(shí),任何賦予該組角色的權(quán)限也都必須被撤消。
- PostgreSQL USAGE和SELECT權(quán)限案例深入分析
- Postgresql 數(shù)據(jù)庫權(quán)限功能的使用總結(jié)
- PostgreSQL 默認(rèn)權(quán)限查看方式
- Postgresql 賦予用戶權(quán)限和撤銷權(quán)限的實(shí)例
- 查看postgresql數(shù)據(jù)庫用戶系統(tǒng)權(quán)限、對(duì)象權(quán)限的方法
- 用一整天的時(shí)間安裝postgreSQL NTFS權(quán)限
- 如何在PostgreSQL中創(chuàng)建只讀權(quán)限和讀寫權(quán)限的賬號(hào)
相關(guān)文章
PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法
這篇文章主要為大家詳細(xì)介紹了PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
CentOS 7下安裝PostgreSQL 9.6的教程分享
PostgreSQL在我心目中的地位要遠(yuǎn)遠(yuǎn)高于MySQL,雖然流行對(duì)比MySQL低很對(duì),但是功能性一致走在MySQL的前面。下面這篇文章主要介紹了CentOS 7下安裝PostgreSQL數(shù)據(jù)庫的方法,需要的朋友可以參考借鑒,一起來看看吧。2017-02-02
postgresql 中的COALESCE()函數(shù)使用小技巧
這篇文章主要介紹了postgresql 中的COALESCE()函數(shù)使用小技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Postgres copy命令導(dǎo)入導(dǎo)出數(shù)據(jù)的操作方法
最近有需要對(duì)數(shù)據(jù)進(jìn)行遷移的需求,由于postgres性能的關(guān)系,單表3000W的數(shù)據(jù)量查詢起來有一些慢,需要對(duì)大表進(jìn)行切割,拆成若干個(gè)子表,涉及到原有數(shù)據(jù)要遷移到子表的需求,這篇文章主要介紹了Postgres copy命令導(dǎo)入導(dǎo)出數(shù)據(jù)的操作方法,需要的朋友可以參考下2024-08-08
解決PostgreSQL數(shù)據(jù)遷移過程中的數(shù)據(jù)類型不匹配問題
在數(shù)據(jù)遷移的過程中,經(jīng)常會(huì)遇到源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫之間的數(shù)據(jù)類型不匹配的情況,對(duì)于 PostgreSQL 數(shù)據(jù)庫來說,處理這種數(shù)據(jù)類型不匹配問題需要一些特定的策略和技巧,需要的朋友可以參考下2024-07-07
使用postgresql 模擬批量數(shù)據(jù)插入的案例
這篇文章主要介紹了使用postgresql 模擬批量數(shù)據(jù)插入的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會(huì)多出一個(gè)空格的問題
這篇文章主要介紹了解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會(huì)多出一個(gè)空格的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
PostgreSQL教程(十四):數(shù)據(jù)庫維護(hù)
這篇文章主要介紹了PostgreSQL教程(十四):數(shù)據(jù)庫維護(hù),本文講解了恢復(fù)磁盤空間、更新規(guī)劃器統(tǒng)計(jì)、VACUUM和ANALYZE的示例、定期重建索引等內(nèi)容,需要的朋友可以參考下2015-05-05

