支援版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

21.3. 角色成員關係 #

通常將使用者群組在一起,以簡化權限管理是很方便的:這樣,權限可以被授予給或撤銷來自整個群組。在 PostgreSQL 中,這是通過建立一個代表群組的角色,然後將群組角色的成員關係授予給個別使用者角色來完成的。

要設定群組角色,首先建立角色

CREATE ROLE name;

通常,用作群組的角色不會具有 LOGIN 屬性,但如果需要,可以設定它。

一旦群組角色存在,您可以使用 GRANTREVOKE 命令添加和移除成員

GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;

您也可以將成員關係授予給其他群組角色(因為群組角色和非群組角色之間實際上沒有任何區別)。資料庫不會讓您建立循環成員關係迴圈。此外,不允許將角色中的成員關係授予給 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 的權限,以及授予給 adminisland 的任何權限,因為 joe 繼承了這些權限。但是,授予給 wheel 的權限不可用,因為即使 joe 間接是 wheel 的成員,成員關係也是通過使用 WITH INHERIT FALSE 授予的 admin 建立的。執行以下操作後

SET ROLE admin;

連線將只使用授予給 admin 的權限,而不是授予給 joeisland 的權限。執行以下操作後

SET ROLE wheel;

連線將只使用授予給 wheel 的權限,而不是授予給 joeadmin 的權限。可以使用以下任何一種方式恢復原始權限狀態:

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

注意

SET ROLE 命令始終允許選擇原始登入角色直接或間接為成員的任何角色,前提是存在成員關係授予鏈,每個授予都具有 SET TRUE(這是預設值)。因此,在上面的例子中,沒有必要在成為 wheel 之前成為 admin。另一方面,根本不可能成為 islandjoe 只能通過繼承來訪問這些權限。

注意

在 SQL 標準中,使用者和角色之間存在明顯的區別,使用者不會自動繼承權限,而角色會。這種行為可以在 PostgreSQL 中通過將用作 SQL 角色的角色賦予 INHERIT 屬性,同時將用作 SQL 使用者的角色賦予 NOINHERIT 屬性來獲得。但是,PostgreSQL 預設為所有角色賦予 INHERIT 屬性,以便與 pre-8.1 版本向後相容,在這些版本中,使用者始終可以使用授予給他們所屬群組的權限。

角色屬性 LOGINSUPERUSERCREATEDBCREATEROLE 可以被認為是特殊權限,但它們永遠不會像資料庫物件上的普通權限那樣被繼承。您必須實際 SET ROLE 到具有這些屬性之一的特定角色,才能使用該屬性。繼續上面的例子,我們可以選擇將 CREATEDBCREATEROLE 授予給 admin 角色。然後,以角色 joe 連線的連線不會立即擁有這些權限,只有在執行 SET ROLE admin 之後才會。

要銷毀群組角色,請使用 DROP ROLE

DROP ROLE name;

群組角色中的任何成員關係都會自動撤銷(但成員角色不會受到其他影響)。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的體驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。