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