支持的版本:当前 (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 的权限不可用,因为即使 joewheel 的间接成员,其成员资格是通过使用 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(这是默认设置)。因此,在上面的示例中,不必先成为 admin 才能成为 wheel。另一方面,根本不可能成为 islandjoe 只能通过继承访问这些权限。

注意

在 SQL 标准中,用户和角色之间有明显的区别,用户不会自动继承权限,而角色会继承。在 PostgreSQL 中,可以通过为用作 SQL 角色的角色赋予 INHERIT 属性,同时为用作 SQL 用户的角色赋予 NOINHERIT 属性来获得此行为。但是,为了与 8.1 之前的版本向后兼容,PostgreSQL 默认为所有角色赋予 INHERIT 属性,在这些版本中,用户始终可以使用授予其成员的组的权限。

角色属性 LOGINSUPERUSERCREATEDBCREATEROLE 可以被认为是特殊权限,但它们永远不会像数据库对象上的普通权限那样被继承。您必须实际 SET ROLE 到具有这些属性之一的特定角色才能使用该属性。继续上面的示例,我们可以选择将 CREATEDBCREATEROLE 授予 admin 角色。然后,以角色 joe 连接的会话不会立即拥有这些权限,只有在执行 SET ROLE admin 后才会拥有这些权限。

要销毁组角色,请使用 DROP ROLE

DROP ROLE name;

该组角色中的任何成员资格都会被自动撤销(但成员角色不会受到其他影响)。

提交更正

如果您在文档中发现任何不正确的内容、与您特定功能的使用体验不符的内容或需要进一步澄清的内容,请使用此表格报告文档问题。