PostgreSQL 提供了一组预定义的角色,这些角色提供访问某些常用权限和信息的权限。管理员(包括拥有 CREATEROLE
权限的角色)可以向其环境中的用户和/或其他角色 GRANT
这些角色,为这些用户提供访问指定权限和信息的权限。
表 21.1 中描述了预定义角色。请注意,随着新增功能的添加,每个角色的具体权限可能会在未来发生变化。管理员应监控发行说明以了解更改。
表 21.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_maintain | 允许对所有关系执行 VACUUM 、ANALYZE 、CLUSTER 、REFRESH MATERIALIZED VIEW 、REINDEX 和 LOCK TABLE ,拥有对这些对象执行 MAINTAIN 权限,即使没有明确授予此权限。 |
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.28.2 节。
角色 pg_read_server_files
、pg_write_server_files
和 pg_execute_server_program
的目的是允许管理员拥有受信任但非超级用户的角色,这些角色能够访问文件并作为运行数据库的用户在数据库服务器上运行程序。由于这些角色能够访问服务器文件系统上的任何文件,因此在直接访问文件时,它们会绕过所有数据库级别的权限检查,并且可用于获得超级用户级别的访问权限,因此在向用户授予这些角色时应格外小心。
在授予这些角色时要小心,以确保它们仅在需要时使用,并且要了解这些角色授予访问特权信息。
管理员可以使用 GRANT
命令将访问权限授予给这些角色的用户,例如
GRANT pg_signal_backend TO admin_user;