Skip to content

22.5. 预定义角色#

PostgreSQL提供了一组预定义角色,这些角色提供对某些通常需要的特权功能和信息的访问权限。管理员(包括拥有CREATEROLE特权的角色)可以向其环境中的用户和/或其他角色GRANT这些角色,为这些用户提供对指定功能和信息的访问权限。

表 22.1中描述了预定义角色。请注意,随着添加其他功能,每个角色的特定权限将来可能会发生变化。管理员应监控发行说明以了解更改。

表 22.1. 预定义角色

角色允许的访问权限
pg_read_all_data读取所有数据(表、视图、序列),就像拥有对这些对象的 SELECT 权限以及对所有模式的 USAGE 权限一样,即使没有明确拥有。此角色没有设置角色属性 BYPASSRLS。如果正在使用 RLS,管理员可能希望对授予此角色的角色设置 BYPASSRLS
pg_write_all_data写入所有数据(表、视图、序列),就像拥有对这些对象的 INSERTUPDATEDELETE 权限以及对所有模式的 USAGE 权限一样,即使没有明确拥有。此角色没有设置角色属性 BYPASSRLS。如果正在使用 RLS,管理员可能希望对授予此角色的角色设置 BYPASSRLS
pg_read_all_settings读取所有配置变量,即使是通常仅对超级用户可见的变量。
pg_read_all_stats读取所有 pg_stat_* 视图并使用各种统计相关扩展,即使是通常仅对超级用户可见的扩展。
pg_stat_scan_tables执行可能长时间对表进行 ACCESS SHARE 锁定的监控函数。
pg_monitor读取/执行各种监控视图和函数。此角色是 pg_read_all_settingspg_read_all_statspg_stat_scan_tables 的成员。
pg_database_owner无。成员资格隐含地由当前数据库所有者组成。
pg_signal_backend向另一个后端发出信号,以取消查询或终止其会话。
pg_read_server_files允许使用 COPY 和其他文件访问函数从数据库服务器上数据库可以访问的任何位置读取文件。
pg_write_server_files允许使用 COPY 和其他允许执行服务器端程序的文件访问函数将文件写入数据库服务器上数据库可以访问的任何位置。
pg_execute_server_program允许使用 COPY 和其他允许执行服务器端程序的函数以数据库运行的用户身份在数据库服务器上执行程序。
pg_checkpoint允许执行 CHECKPOINT 命令。
pg_use_reserved_connections允许使用通过 reserved_connections 保留的连接槽。
pg_create_subscription允许对数据库拥有 CREATE 权限的用户发出 CREATE SUBSCRIPTION

pg_monitorpg_read_all_settingspg_read_all_statspg_stat_scan_tables角色旨在允许管理员轻松配置角色以用于监控数据库服务器。它们授予一组通用权限,允许角色读取各种有用的配置设置、统计信息和其他通常仅限超级用户访问的系统信息。

pg_database_owner角色有一个隐含的、依赖于情况的成员,即当前数据库的所有者。与任何角色一样,它可以拥有对象或接收访问权限的授予。因此,一旦pg_database_owner在模板数据库中拥有权限,每个从该模板实例化的数据库的所有者都将行使这些权限。pg_database_owner不能是任何角色的成员,并且不能有非隐含成员。最初,此角色拥有public架构,因此每个数据库所有者都管理架构的本地使用。

pg_signal_backend角色旨在允许管理员启用受信任的(但不是超级用户)角色向其他后端发送信号。目前,此角色允许发送信号以取消另一个后端上的查询或终止其会话。但是,授予此角色的用户不能向超级用户拥有的后端发送信号。参见第 9.27.2 节

pg_read_server_filespg_write_server_filespg_execute_server_program角色旨在允许管理员拥有受信任的(但不是超级用户)角色,这些角色能够访问文件并在数据库服务器上以数据库运行的用户身份运行程序。由于这些角色能够访问服务器文件系统上的任何文件,因此它们在直接访问文件时绕过所有数据库级权限检查,并且可用于获取超级用户级访问权限,因此在向用户授予这些角色时应格外小心。

在授予这些角色时应小心,以确保仅在需要时使用它们,并了解这些角色授予对特权信息的访问权限。

管理员可以使用GRANT命令向用户授予对这些角色的访问权限,例如

GRANT pg_signal_backend TO admin_user;