為了方便管理許可權,將使用者分組是非常有用的:這樣,許可權可以作為一個整體授予或撤銷給一個組。在PostgreSQL中,這是透過建立一個代表該組的角色,然後將單個使用者角色的成員身份授予該組角色來實現的。
要設定一個組角色,首先建立該角色
CREATE ROLE name
;
通常用作組的角色不會有LOGIN
屬性,儘管您可以根據需要設定它。
一旦組角色存在,您就可以使用GRANT
和REVOKE
命令新增和刪除成員。
GRANTgroup_role
TOrole1
, ... ; REVOKEgroup_role
FROMrole1
, ... ;
您也可以授予其他組角色成員身份(因為組角色和非組角色之間實際上沒有區別)。資料庫不會允許您設定迴圈成員關係。此外,不允許將成員身份授予PUBLIC
角色。
組角色的成員可以透過兩種方式使用該角色的許可權。首先,已授予SET
選項成員身份的成員角色可以執行SET ROLE
命令來暫時“成為”組角色。在這種狀態下,資料庫會話擁有組角色的許可權,而不是原始登入角色的許可權,並且建立的任何資料庫物件都將被視為由組角色擁有,而不是登入角色擁有。其次,已授予INHERIT
選項成員身份的成員角色會自動擁有其直接或間接成員的角色的許可權,但該鏈會在缺少繼承選項的成員關係處停止。例如,假設我們已經執行了
CREATE ROLE joe LOGIN; CREATE ROLE admin; CREATE ROLE wheel; CREATE ROLE island; GRANT admin TO joe WITH INHERIT TRUE; GRANT wheel TO admin WITH INHERIT FALSE; GRANT island TO joe WITH INHERIT TRUE, SET FALSE;
連線到joe
角色後,資料庫會話將擁有直接授予joe
的許可權,以及授予admin
和island
的許可權,因為joe
“繼承”了這些許可權。但是,授予wheel
的許可權不可用,因為即使joe
間接是wheel
的成員,該成員關係是透過admin
進行的,而admin
是使用WITH INHERIT FALSE
授予的。執行
SET ROLE admin;
之後,會話將僅擁有授予admin
的許可權,而不會擁有授予joe
或island
的許可權。執行
SET ROLE wheel;
之後,會話將僅擁有授予wheel
的許可權,而不會擁有授予joe
或admin
的許可權。可以使用以下任何命令恢復原始許可權狀態:
SET ROLE joe; SET ROLE NONE; RESET ROLE;
在SET ROLE
命令總是允許選擇原始登入角色直接或間接是其成員的任何角色,前提是存在一個成員關係授予鏈,其中每個鏈都具有SET TRUE
(這是預設值)。因此,在上面的例子中,不必先成為admin
再成為wheel
。另一方面,根本無法成為island
;joe
只能透過繼承訪問這些許可權。
在SQL標準中,使用者和角色之間存在明顯的區別,使用者不會自動繼承許可權,而角色會。在PostgreSQL中,可以透過賦予用作SQL角色的角色INHERIT
屬性,同時賦予用作SQL使用者的角色NOINHERIT
屬性來獲得此行為。然而,PostgreSQL預設賦予所有角色INHERIT
屬性,以向8.1之前版本的相容性,當時使用者總是可以使用授予其所屬組的許可權。
角色屬性LOGIN
、SUPERUSER
、CREATEDB
和CREATEROLE
可以被視為特殊許可權,但它們從不像資料庫物件上的普通許可權那樣被繼承。您必須實際執行SET ROLE
來切換到一個具有其中一個屬性的特定角色,才能使用該屬性。繼續上面的例子,我們可以選擇將CREATEDB
和CREATEROLE
授予admin
角色。然後,連線為joe
角色的會話將不會立即擁有這些許可權,只有在執行SET ROLE admin
之後才會有。
要銷燬一個組角色,請使用DROP ROLE
命令。
DROP ROLE name
;
組角色中的任何成員關係都會被自動撤銷(但成員角色不會受到其他影響)。
如果您在文件中發現任何不正確之處、與您在使用特定功能時的體驗不符之處,或者需要進一步澄清之處,請使用此表單報告文件問題。