为了方便管理权限,经常将用户分组:这样,可以向整个组授予或撤销权限。在 PostgreSQL 中,这是通过创建一个代表该组的角色,然后向各个用户角色授予组角色中的成员资格来完成的。
要设置组角色,首先创建角色
CREATE ROLE name;
通常,用作组的角色不会有 LOGIN 属性,但如果你愿意,可以设置它。
组角色存在后,你可以使用 GRANT 和 REVOKE 命令添加和删除成员
GRANTgroup_roleTOrole1, ... ; REVOKEgroup_roleFROMrole1, ... ;
你也可以授予其他组角色成员资格(因为组角色和非组角色之间并没有真正的区别)。数据库不会让你设置循环成员资格循环。此外,不允许授予 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 的权限以及授予 admin 和 island 的任何权限,因为 joe “继承” 那些权限。但是,授予 wheel 的权限不可用,因为即使 joe 间接是 wheel 的成员,该成员资格也是通过使用 WITH INHERIT FALSE 授予的 admin。之后
SET ROLE admin;
会话将仅使用授予 admin 的那些权限,而不是授予 joe 或 island 的那些权限。之后
SET ROLE wheel;
会话将仅使用授予 wheel 的那些权限,而不是授予 joe 或 admin 的那些权限。可以使用以下任何命令恢复原始权限状态
SET ROLE joe; SET ROLE NONE; RESET ROLE;
SET ROLE 命令始终允许选择原始登录角色直接或间接成为其成员的任何角色,前提是存在每个都具有 SET TRUE(这是默认值)的成员资格授予链。因此,在上述示例中,在成为 wheel 之前无需成为 admin。另一方面,根本无法成为 island;joe 只能通过继承访问那些权限。
在 SQL 标准中,用户和角色之间存在明确的区别,用户不会自动继承权限,而角色会。在 PostgreSQL 中,可以通过为用作 SQL 角色的角色赋予 INHERIT 属性,而为用作 SQL 用户的角色赋予 NOINHERIT 属性来获得此行为。但是,PostgreSQL 默认赋予所有角色 INHERIT 属性,以便向后兼容 8.1 之前的版本,在这些版本中,用户始终可以使用授予其所属组的权限。
角色属性 LOGIN、SUPERUSER、CREATEDB 和 CREATEROLE 可以被视为特殊权限,但它们永远不会像数据库对象上的普通权限那样被继承。您必须实际 SET ROLE 为具有这些属性之一的特定角色,才能使用该属性。继续上面的示例,我们可能会选择将 CREATEDB 和 CREATEROLE 授予 admin 角色。然后,以角色 joe 连接的会话不会立即拥有这些权限,只有在执行 SET ROLE admin 之后才会拥有。
要销毁组角色,请使用 DROP ROLE
DROP ROLE name;
组角色中的任何成员资格都会自动被撤销(但成员角色不会受到其他影响)。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。