↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 12 已结束支持。 2024-11-21. 请参阅 当前版本手册.

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 权限的角色,也可以更改和删除其他角色,并且可以授予或撤销其中的成员资格。更改角色包括使用 ALTER ROLE 能进行的大多数修改,例如更改密码。它还包括使用 COMMENT 和 SECURITY LABEL 命令对角色进行的修改。

然而,CREATEROLE 并不赋予创建 SUPERUSER 角色的能力,也不赋予对已经存在的 SUPERUSER 角色的任何控制权。此外,CREATEROLE 也不赋予创建 REPLICATION 用户的能力,也不能授予或撤销 REPLICATION 权限,也不能修改这类用户的角色属性。不过,它允许在 REPLICATION 角色上使用 ALTER ROLE ... SET 和 ALTER ROLE ... RENAME,以及使用 COMMENT ON ROLE、SECURITY LABEL ON ROLE 和 DROP ROLE。最后,CREATEROLE 也不赋予授予或撤销 BYPASSRLS 权限的能力。

由于 CREATEROLE 权限允许用户即使对某些角色(尚)没有任何访问权,也能授予或撤销其中的成员资格,因此 CREATEROLE 用户可以获得系统中每个预定义角色的能力,包括 pg_execute_server_program 和 pg_write_server_files 这类高权限角色。

发起复制

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

密码

只有在客户端认证方法要求用户连接数据库时提供密码时,密码才有意义。password 和 md5 认证方法都会使用密码。数据库密码与操作系统密码是分离的。可在创建角色时通过 CREATE ROLE name PASSWORD 'string' 指定密码。

权限继承

默认情况下,角色会继承其所属角色的权限。不过,要创建一个默认不继承权限的角色,使用 CREATE ROLE name NOINHERIT。

绕过行级安全

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

连接限制

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

角色创建后,可以使用以下命令修改其属性:ALTER ROLE。详情请参见 CREATE ROLE 和 ALTER ROLE 命令的参考页。

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

ALTER ROLE myname SET enable_indexscan TO off;

这会保存该设置(但不会立即生效)。在该角色后续建立的连接中,它看起来就像在会话开始之前执行了 SET enable_indexscan TO off 一样。你仍然可以在会话期间更改该设置;它只会作为默认值。要移除角色特定默认设置,使用 ALTER ROLE rolename RESET varname。注意,附加到没有 LOGIN 权限的角色上的角色特定默认值几乎没有用,因为它们永远不会生效。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.