选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

20.4. 角色成员资格 #

为了简化权限管理,把用户分组通常很方便:这样,权限就可以整体授予给一个组,或者从整个组中撤销。在PostgreSQL中,这通过创建一个表示该组的角色,然后把该组角色中的成员资格授予各个用户角色来实现。

要建立一个组角色,首先创建该角色:

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,该成员资格也是通过 admin 获得的,而后者具有 NOINHERIT 属性。执行以下命令后:

SET ROLE admin;

会话将只能使用授予 admin 的权限,而不能使用授予 joe 的权限。执行以下命令后:

SET ROLE wheel;

会话将只能使用授予 wheel 的权限,而不能使用授予 joeadmin 的权限。使用以下任一命令可以恢复原始的权限状态:

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

注意

SET ROLE命令总是允许切换到原始登录角色直接或间接所属的任何角色。因此,在上例中,没有必要先成为admin再成为wheel

注意

在 SQL 标准中,用户与角色有明确区分,用户不会自动继承权限,而角色会。行为在PostgreSQL中可以通过给用作 SQL 角色的角色赋予INHERIT属性、给用作 SQL 用户的角色赋予NOINHERIT属性来获得。不过,为了向后兼容 8.1 之前的版本(那时用户总是可以使用其所属组被授予的权限),PostgreSQL默认为所有角色赋予INHERIT属性。

角色属性LOGINSUPERUSERCREATEDBCREATEROLE可以被视为特殊权限,但它们从不会像数据库对象上的普通权限那样被继承。要使用其中之一,必须实际执行SET ROLE切换到拥有该属性的特定角色。继续上面的例子,我们可以选择把CREATEDBCREATEROLE赋予admin角色。这样,一个以joe角色连接的会话并不会立即拥有这些权限,只有在执行SET ROLE admin之后才会拥有。

要销毁组角色,使用DROP ROLE

DROP ROLE name;

组角色中的任何成员资格都会被自动撤销(但成员角色本身不受其他影响)。但要注意,组角色拥有的任何对象必须先被删除或重新指派给其他所有者;授予组角色的任何权限也必须先被撤销。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。