2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前 (18) / 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選項成員身份的成員角色會自動擁有其直接或間接成員的角色的許可權,但該鏈會在缺少繼承選項的成員關係處停止。例如,假設我們已經執行了

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的成員,該成員關係是透過admin進行的,而admin是使用WITH INHERIT FALSE授予的。執行

SET ROLE admin;

之後,會話將僅擁有授予admin的許可權,而不會擁有授予joeisland的許可權。執行

SET ROLE wheel;

之後,會話將僅擁有授予wheel的許可權,而不會擁有授予joeadmin的許可權。可以使用以下任何命令恢復原始許可權狀態:

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

注意

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

注意

在SQL標準中,使用者和角色之間存在明顯的區別,使用者不會自動繼承許可權,而角色會。在PostgreSQL中,可以透過賦予用作SQL角色的角色INHERIT屬性,同時賦予用作SQL使用者的角色NOINHERIT屬性來獲得此行為。然而,PostgreSQL預設賦予所有角色INHERIT屬性,以向8.1之前版本的相容性,當時使用者總是可以使用授予其所屬組的許可權。

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

要銷燬一個組角色,請使用DROP ROLE命令。

DROP ROLE name;

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

提交更正

如果您在文件中發現任何不正確之處、與您在使用特定功能時的體驗不符之處,或者需要進一步澄清之處,請使用此表單報告文件問題。