21.3. 角色成员资格

将用户分组在一起以简化特权 Management 通常很方便:这样,可以将特权授予整个组或从整个组撤消。在 PostgreSQL 中,这是通过创建代表组的角色,然后将组角色中的* membership *授予单个用户角色来完成的。

要设置组角色,首先创建角色:

CREATE ROLE name;

通常,用作角色的角色不会具有LOGIN属性,尽管您可以根据需要进行设置。

组角色一旦存在,就可以使用GRANTREVOKE命令添加和删除成员:

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

您也可以将成员资格授予其他组角色(因为组角色和非组角色之间实际上没有任何区别)。该数据库将不允许您设置循环成员资格循环。另外,不允许向PUBLIC授予角色成员身份。

组角色的成员可以两种方式使用角色的特权。首先,组中的每个成员都可以显式执行SET ROLE来暂时“成为”组角色。在这种状态下,数据库会话可以访问组角色而不是原始登录角色的特权,并且创建的任何数据库对象都被视为由组角色而非登录角色拥有。其次,具有INHERIT属性的成员角色会自动使用其所属成员角色的特权,包括这些角色继承的任何特权。例如,假设我们已经完成:

CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;

以角色joe的身份连接后,数据库会话将立即使用直接授予joe的特权以及授予admin的任何特权,因为joe“继承”了admin的特权。但是,授予wheel的特权不可用,因为即使joe间接地是wheel的成员,成员资格也通过具有NOINHERIT属性的admin进行。后:

SET ROLE admin;

该会话将仅使用授予admin的那些特权,而不使用授予joe的那些特权。后:

SET ROLE wheel;

该会话将仅使用授予wheel的那些特权,而不使用授予joeadmin的那些特权。可以使用以下任一方法恢复原始特权状态:

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

Note

SET ROLE命令始终允许选择原始登录角色直接或间接成为其成员的任何角色。因此,在以上示例中,不必在成为wheel之前先成为admin

Note

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

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

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

DROP ROLE name;

组角色中的所有成员资格都将自动撤消(但成员角色不会受到其他影响)。