通常將使用者群組在一起,以簡化權限管理是很方便的:這樣,權限可以被授予給或撤銷來自整個群組。在 PostgreSQL 中,這是通過建立一個代表群組的角色,然後將群組角色的成員關係授予給個別使用者角色來完成的。
要設定群組角色,首先建立角色
CREATE ROLE name
;
通常,用作群組的角色不會具有 LOGIN
屬性,但如果需要,可以設定它。
一旦群組角色存在,您可以使用 GRANT
和 REVOKE
命令添加和移除成員
GRANTgroup_role
TOrole1
, ... ; REVOKEgroup_role
FROMrole1
, ... ;
您也可以將成員關係授予給其他群組角色(因為群組角色和非群組角色之間實際上沒有任何區別)。資料庫不會讓您建立循環成員關係迴圈。此外,不允許將角色中的成員關係授予給 PUBLIC
。
群組角色的成員可以通過兩種方式使用該角色的權限。首先,已被授予 SET
選項的成員角色可以執行 SET ROLE
以暫時「成為」該群組角色。在這種狀態下,資料庫連線具有群組角色的權限,而不是原始登入角色的權限,並且建立的任何資料庫物件都被認為是群組角色所擁有,而不是登入角色所擁有。其次,已被授予 INHERIT
選項的成員角色會自動使用直接或間接成員的權限,儘管鏈會在缺少 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
的成員,成員關係也是通過使用 WITH INHERIT FALSE
授予的 admin
建立的。執行以下操作後
SET ROLE admin;
連線將只使用授予給 admin
的權限,而不是授予給 joe
或 island
的權限。執行以下操作後
SET ROLE wheel;
連線將只使用授予給 wheel
的權限,而不是授予給 joe
或 admin
的權限。可以使用以下任何一種方式恢復原始權限狀態:
SET ROLE joe; SET ROLE NONE; RESET ROLE;
SET ROLE
命令始終允許選擇原始登入角色直接或間接為成員的任何角色,前提是存在成員關係授予鏈,每個授予都具有 SET TRUE
(這是預設值)。因此,在上面的例子中,沒有必要在成為 wheel
之前成為 admin
。另一方面,根本不可能成為 island
;joe
只能通過繼承來訪問這些權限。
在 SQL 標準中,使用者和角色之間存在明顯的區別,使用者不會自動繼承權限,而角色會。這種行為可以在 PostgreSQL 中通過將用作 SQL 角色的角色賦予 INHERIT
屬性,同時將用作 SQL 使用者的角色賦予 NOINHERIT
屬性來獲得。但是,PostgreSQL 預設為所有角色賦予 INHERIT
屬性,以便與 pre-8.1 版本向後相容,在這些版本中,使用者始終可以使用授予給他們所屬群組的權限。
角色屬性 LOGIN
、SUPERUSER
、CREATEDB
和 CREATEROLE
可以被認為是特殊權限,但它們永遠不會像資料庫物件上的普通權限那樣被繼承。您必須實際 SET ROLE
到具有這些屬性之一的特定角色,才能使用該屬性。繼續上面的例子,我們可以選擇將 CREATEDB
和 CREATEROLE
授予給 admin
角色。然後,以角色 joe
連線的連線不會立即擁有這些權限,只有在執行 SET ROLE admin
之後才會。
要銷毀群組角色,請使用 DROP ROLE
DROP ROLE name
;
群組角色中的任何成員關係都會自動撤銷(但成員角色不會受到其他影響)。
如果您在文件中發現任何不正確、與您使用特定功能的體驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。