预定义角色

一个内置角色,提供对某些常用特权功能和信息的访问权限

一个 预定义角色 是一个内置角色,提供对某些常用特权功能和信息的访问权限。无需将用户设为超级用户,即可将此类角色的成员资格授予单个用户。

预定义角色PostgreSQL 9.6 中引入,尽管最初只有一个角色可用 (pg_signal_backend)。

可用性

  18 17 16 15 14 13 12 11 10 9.6
pg_checkpoint                    
pg_create_subscription                    
pg_database_owner                    
pg_execute_server_program                    
pg_maintain                    
pg_monitor                    
pg_read_all_data                    
pg_read_all_settings                    
pg_read_all_stats                    
pg_read_server_files                    
pg_signal_autovacuum_worker                    
pg_signal_backend                    
pg_stat_scan_tables                    
pg_use_reserved_connections                    
pg_write_all_data                    
pg_write_server_files                    

pg_monitor

The pg_monitor 角色组合了以下默认角色

  • pg_read_all_settings
  • pg_read_all_stats
  • pg_stat_scan_tables

并提供以下文件系统函数的执行权限

(但不包括 pg_ls_dir())。

另请参阅: src/backend/catalog/system_views.sql

源代码

以下表示每个默认角色的 OID 的常量在编译时创建 (src/include/catalog/pg_authid.dat)

  • ROLE_PG_CHECKPOINT
  • ROLE_PG_CREATE_SUBSCRIPTION
  • ROLE_PG_DATABASE_OWNER
  • ROLE_PG_EXECUTE_SERVER_PROGRAM
  • ROLE_PG_MAINTAIN
  • ROLE_PG_MONITOR
  • ROLE_PG_READ_ALL_DATA
  • ROLE_PG_READ_ALL_SETTINGS
  • ROLE_PG_READ_ALL_STATS
  • ROLE_PG_READ_SERVER_FILES
  • ROLE_PG_SIGNAL_AUTOVACUUM_WORKER
  • ROLE_PG_SIGNAL_BACKENDID
  • ROLE_PG_STAT_SCAN_TABLES
  • ROLE_PG_USE_RESERVED_CONNECTIONS
  • ROLE_PG_WRITE_ALL_DATA
  • ROLE_PG_WRITE_SERVER_FILES

注意:在 PostgreSQL 13 及更早版本中,这些常量以“DEFAULT_ROLE_”为前缀。

重命名提案

PostgreSQL 13 开发周期中,有人提议将“default_role”重命名为“predefined role”,并且更改实际上已提交(提交 0e936a21),但随后在进一步讨论之前恢复(提交 c185a577)。此更改后来在 PostgreSQL 14 中完成(提交 c9c41c7a)。

更改历史记录

请注意,pg_maintain 角色首先在 PostgreSQL 16 中添加(提交 60684dd8),但随后恢复(提交 151c22de)。

示例

postgres=> \du someuser
           List of roles
 Role name | Attributes | Member of
-----------+------------+-----------
 someuser  |            | {}

postgres=> SHOW data_directory;
ERROR:  must be superuser or a member of pg_read_all_settings to examine "data_directory"

postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".

postgres=# GRANT pg_read_all_settings TO someuser;
GRANT ROLE

postgres=# \c - someuser
You are now connected to database "postgres" as user "someuser".

postgres=> \du someuser
                  List of roles
 Role name | Attributes |       Member of
-----------+------------+------------------------
 someuser  |            | {pg_read_all_settings}

postgres=> SHOW data_directory;
    data_directory
---------------------
 /var/lib/pgsql/data
(1 row)

C 语言中的用法示例

#include "utils/acl.h"
#include "catalog/pg_authid.h"

...
	if (is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS) == false)
	{
		elog(ERROR, "must be superuser or a member of the pg_read_all_stats role");
	}
...

类别

管理/管理安全

反馈

提交有关“预定义角色”的任何评论、建议或更正 此处