2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

21.2. 角色属性 #

数据库角色可以拥有许多属性,这些属性定义了其权限并与客户端身份验证系统进行交互。

登录权限

只有具有 LOGIN 属性的角色才能用作数据库连接的初始角色名。具有 LOGIN 属性的角色可以被认为是“数据库用户”。要创建一个具有登录权限的角色,请使用以下任一方法:

CREATE ROLE name LOGIN;
CREATE USER name;

(CREATE USER 等同于 CREATE ROLE,只是 CREATE USER 默认包含 LOGIN,而 CREATE ROLE 不包含。)

超级用户状态

数据库超级用户会绕过所有权限检查,除了登录权。这是一个危险的特权,不应随意使用;最好以非超级用户的角色来完成大部分工作。要创建新的数据库超级用户,请使用 CREATE ROLE name SUPERUSER。您必须以已是超级用户的角色来执行此操作。

数据库创建

角色必须被明确授予创建数据库的权限(超级用户除外,因为他们会绕过所有权限检查)。要创建这样的角色,请使用 CREATE ROLE name CREATEDB

角色创建

角色必须被明确授予创建更多角色的权限(超级用户除外,因为他们会绕过所有权限检查)。要创建这样的角色,请使用 CREATE ROLE name CREATEROLE。具有 CREATEROLE 权限的角色可以修改和删除已授予 ADMIN 选项的 CREATEROLE 用户的角色。当一个非超级用户的 CREATEROLE 用户创建新角色时,会自动执行此类授予,因此默认情况下,CREATEROLE 用户可以修改和删除他们创建的角色。修改角色包括使用 ALTER ROLE 可以进行的绝大多数更改,包括(例如)更改密码。它还包括使用 COMMENTSECURITY LABEL 命令对角色进行的修改。

但是,CREATEROLE 不赋予创建 SUPERUSER 角色的能力,也不赋予对已存在的 SUPERUSER 角色的任何权力。此外,CREATEROLE 不赋予创建 REPLICATION 用户的能力,也不能授予或撤销 REPLICATION 权限,也不能修改这些用户的角色属性。但是,它允许对 REPLICATION 角色使用 ALTER ROLE ... SETALTER ROLE ... RENAME,以及使用 COMMENT ON ROLESECURITY LABEL ON ROLEDROP ROLE。最后,CREATEROLE 不授予授予或撤销 BYPASSRLS 权限的能力。

启动复制

角色必须被明确授予启动流复制的权限(超级用户除外,因为他们会绕过所有权限检查)。用于流复制的角色也必须具有 LOGIN 权限。要创建这样的角色,请使用 CREATE ROLE name REPLICATION LOGIN

密码

仅当客户端身份验证方法要求用户在连接数据库时提供密码时,密码才具有意义。passwordmd5 身份验证方法使用密码。数据库密码与操作系统密码是分开的。在创建角色时使用 CREATE ROLE name PASSWORD 'string' 指定密码。

权限继承

默认情况下,角色会继承其成员角色的权限。但是,要创建一个默认不继承权限的角色,请使用 CREATE ROLE name NOINHERIT。或者,可以使用 WITH INHERIT TRUEWITH INHERIT FALSE 为单个授予覆盖继承。

绕过行级安全

角色必须被明确授予绕过所有行级安全 (RLS) 策略的权限(超级用户除外,因为他们会绕过所有权限检查)。要创建这样的角色,请以超级用户身份使用 CREATE ROLE name BYPASSRLS

连接限制

连接限制可以指定角色可以建立多少个并发连接。-1(默认值)表示无限制。在创建角色时使用 CREATE ROLE name CONNECTION LIMIT 'integer' 指定连接限制。

创建角色后,可以使用 ALTER ROLE 修改角色的属性。 有关详细信息,请参阅 CREATE ROLEALTER ROLE 命令的参考页。

角色还可以为 第 19 章 中描述的许多运行时配置设置设置角色特定的默认值。例如,如果您因为某种原因希望在每次连接时禁用索引扫描(提示:这通常不是一个好主意),您可以使用

ALTER ROLE myname SET enable_indexscan TO off;

这将保存设置(但不会立即设置)。在以后该角色的后续连接中,它将如同在会话开始前执行了 SET enable_indexscan TO off 一样。您仍然可以在会话期间更改此设置;它只会作为默认值。要删除角色特定的默认设置,请使用 ALTER ROLE rolename RESET varname。请注意,没有 LOGIN 权限的角色所关联的角色特定默认值相当无用,因为它们永远不会被调用。

当一个非超级用户使用 CREATEROLE 权限创建一个角色时,新创建的角色会自动授予给创建者,就如同引导超级用户执行了命令 GRANT created_user TO creating_user WITH ADMIN TRUE, SET FALSE, INHERIT FALSE 一样。由于 CREATEROLE 用户只能在拥有现有角色的 ADMIN OPTION 时才能对该角色行使特殊权限,因此此授予足以让 CREATEROLE 用户管理他们创建的角色。但是,由于新角色是以 INHERIT FALSE, SET FALSE 创建的,CREATEROLE 用户不会继承新角色的权限,也不能使用 SET ROLE 访问该角色的权限。然而,任何拥有某个角色 ADMIN OPTION 的用户都可以将其成员资格授予任何其他用户,因此 CREATEROLE 用户可以通过简单地将该角色授予自己(并设置 INHERIT 和/或 SET 选项)来获得对该角色的访问权限。因此,默认不继承权限或默认不授予 SET ROLE 的事实是为了防止意外,而不是安全特性。还要注意,由于此自动授予是由引导超级用户执行的,因此 CREATEROLE 用户无法撤销或更改它;但是,任何超级用户都可以撤销它、修改它,以及/或向其他 CREATEROLE 用户发出额外的此类授予。任何时候拥有某个角色 ADMIN OPTIONCREATEROLE 用户都可以管理该角色。

提交更正

如果您在文档中发现任何不正确之处、与您对特定功能的实际使用经验不符之处,或者需要进一步说明的地方,请使用 此表单 报告文档问题。