如何在 PostgreSQL 中获取用户特定的设置?

dez*_*zso 5 postgresql role configuration users

我必须收集一些PostgreSQL角色的信息。一条信息是角色是否具有与“通常”不同的设置,这里通常意味着只有少数参数的默认值(例如log_statement)。

到目前为止,我只有一个想法:遍历所有用户并发出命令

\c postgres username

SHOW log_statement;
Run Code Online (Sandbox Code Playgroud)

然后处理输出。

我想知道是否有类似查询pg_settings视图、显示每个用户设置的类似方法?我不需要知道特定于会话的差异,只需要知道那些持久化的差异。

fra*_*ncs 8

可以通过查询 pg_catalog.pg_shadow或pg_catalog.pg_user来获取角色配置,如下:

--查询pg_shadow

francs=# select usename,useconfig from pg_shadow ;
   usename    |           useconfig           
--------------+-------------------------------
 postgres     | 
 user_a       | 
 user_b       | 
 skytf_select | {"search_path=skytf, public"}
 francs       | 
 dwetl        | 
 skytf        | 
(7 rows)

francs=# alter role francs  set log_statement='all';
ALTER ROLE

francs=# select usename,useconfig from pg_shadow ;
   usename    |           useconfig           
--------------+-------------------------------
 postgres     | 
 user_a       | 
 user_b       | 
 skytf_select | {"search_path=skytf, public"}
 rancs        | {log_statement=all}
 dwetl        | 
 skytf        | 
(7 rows)
Run Code Online (Sandbox Code Playgroud)


Zor*_*org 6

不幸的pg_shadow是没有显示没有登录权限的角色。

我发现在以下查询中使用 @dezso 提示视图更有用:

SELECT coalesce(role.rolname, 'database wide') as role, 
       coalesce(db.datname, 'cluster wide') as database, 
       setconfig as what_changed
FROM pg_db_role_setting role_setting
LEFT JOIN pg_roles role ON role.oid = role_setting.setrole
LEFT JOIN pg_database db ON db.oid = role_setting.setdatabase;
Run Code Online (Sandbox Code Playgroud)

与往常一样,只需将其添加到 psqlrc 文件(请参阅文档

  • 或者只是在 psql 控制台中输入 **\drds** ) (5认同)