PostgreSQL 提供了一组预定义角色,这些角色提供对某些通常需要的特权功能和信息的访问权限。管理员(包括拥有 CREATEROLE
特权的角色)可以向其环境中的用户和/或其他角色 GRANT
这些角色,为这些用户提供对指定功能和信息的访问权限。
表 22.1 中描述了预定义角色。请注意,随着添加其他功能,每个角色的特定权限将来可能会发生变化。管理员应监控发行说明以了解更改。
表 22.1. 预定义角色
角色 | 允许的访问权限 |
---|---|
pg_read_all_data | 读取所有数据(表、视图、序列),就像拥有对这些对象的 SELECT 权限以及对所有模式的 USAGE 权限一样,即使没有明确拥有。此角色没有设置角色属性 BYPASSRLS 。如果正在使用 RLS,管理员可能希望对授予此角色的角色设置 BYPASSRLS 。 |
pg_write_all_data | 写入所有数据(表、视图、序列),就像拥有对这些对象的 INSERT 、UPDATE 和 DELETE 权限以及对所有模式的 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_settings 、pg_read_all_stats 和 pg_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_stats
和 pg_stat_scan_tables
角色旨在允许管理员轻松配置角色以用于监控数据库服务器。它们授予一组通用权限,允许角色读取各种有用的配置设置、统计信息和其他通常仅限超级用户访问的系统信息。
pg_database_owner
角色有一个隐含的、依赖于情况的成员,即当前数据库的所有者。与任何角色一样,它可以拥有对象或接收访问权限的授予。因此,一旦 pg_database_owner
在模板数据库中拥有权限,每个从该模板实例化的数据库的所有者都将行使这些权限。pg_database_owner
不能是任何角色的成员,并且不能有非隐含成员。最初,此角色拥有 public
架构,因此每个数据库所有者都管理架构的本地使用。
pg_signal_backend
角色旨在允许管理员启用受信任的(但不是超级用户)角色向其他后端发送信号。目前,此角色允许发送信号以取消另一个后端上的查询或终止其会话。但是,授予此角色的用户不能向超级用户拥有的后端发送信号。参见 第 9.27.2 节。
pg_read_server_files
、pg_write_server_files
和 pg_execute_server_program
角色旨在允许管理员拥有受信任的(但不是超级用户)角色,这些角色能够访问文件并在数据库服务器上以数据库运行的用户身份运行程序。由于这些角色能够访问服务器文件系统上的任何文件,因此它们在直接访问文件时绕过所有数据库级权限检查,并且可用于获取超级用户级访问权限,因此在向用户授予这些角色时应格外小心。
在授予这些角色时应小心,以确保仅在需要时使用它们,并了解这些角色授予对特权信息的访问权限。
管理员可以使用 GRANT
命令向用户授予对这些角色的访问权限,例如
GRANT pg_signal_backend TO admin_user;