On this page
21.3. 角色成员资格
将用户分组在一起以简化特权 Management 通常很方便:这样,可以将特权授予整个组或从整个组撤消。在 PostgreSQL 中,这是通过创建代表组的角色,然后将组角色中的* membership *授予单个用户角色来完成的。
要设置组角色,首先创建角色:
CREATE ROLE name;
通常,用作角色的角色不会具有LOGIN
属性,尽管您可以根据需要进行设置。
组角色一旦存在,就可以使用GRANT和REVOKE命令添加和删除成员:
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
的那些特权,而不使用授予joe
或admin
的那些特权。可以使用以下任一方法恢复原始特权状态:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
Note
SET ROLE
命令始终允许选择原始登录角色直接或间接成为其成员的任何角色。因此,在以上示例中,不必在成为wheel
之前先成为admin
。
Note
在 SQL 标准中,用户和角色之间有明显的区别,用户不会像角色那样自动继承特权。在 PostgreSQL 中,可以通过为用作 SQL 角色的角色提供INHERIT
属性,同时为用作 SQL 用户的角色提供NOINHERIT
属性来获得此行为。但是,PostgreSQL 默认将所有角色都赋予INHERIT
属性,以实现与 8.1 之前版本的向后兼容性,在这些版本中,用户始终使用为其成员所属的组授予的权限。
可以将角色属性LOGIN
,SUPERUSER
,CREATEDB
和CREATEROLE
视为特殊特权,但它们绝不会像数据库对象的普通特权那样被继承。为了使用该属性,您实际上必须SET ROLE
到具有这些属性之一的特定角色。continue 上面的示例,我们可能选择将CREATEDB
和CREATEROLE
授予admin
角色。然后,仅在执行SET ROLE admin
之后,以角色joe
身份连接的会话将不会立即具有这些特权。
要销毁群组角色,请使用DROP ROLE:
DROP ROLE name;
组角色中的所有成员资格都将自动撤消(但成员角色不会受到其他影响)。