Postgresql 中文操作指南

22.5. Predefined Roles #

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

预定义角色在 Table 22.1中描述。注意,每个角色的特定权限可能会在将来添加到其他功能时发生改变。管理员应监控发行说明中的更改。

Table 22.1. Predefined Roles

Role

Allowed Access

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_monitor, pg_read_all_settings, pg_read_all_statspg_stat_scan_tables 角色旨在让管理员能够轻松配置角色以用于监控数据库服务器。它们授予一组常见权限,允许角色读取各种有用的配置设置、统计和其他系统信息,而这些信息通常仅限于超级用户。

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

_pg_signal_backend_角色的目的是允许管理员启用受信但非超级用户的角色发送信号到其他后端。此角色当前可以发送信号以取消另一个后端上的查询或终止其会话。然而,授予此角色的用户无法将信号发送到超级用户拥有的后端。请参阅 Section 9.27.2

pg_read_server_files, pg_write_server_filespg_execute_server_program 角色旨在让管理员拥有可信的(但不是超级用户)角色,这些角色能够像用户一样在数据库服务器上访问文件并运行程序(前提是数据库由该用户运行)。由于这些角色能够访问服务器文件系统上的任何文件,因此在直接访问文件时,它们绕过所有数据库级别的权限检查,并且可能会被用来获得超级用户级别的访问权限,因此在将这些角色授予用户时应格外小心。

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

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

GRANT pg_signal_backend TO admin_user;