非Postgres用户无法查询pg_settings中cron.max_running_jobs参数的权限问题排查
解决非PostgreSQL用户无法查看
cron.max_running_jobs的权限问题 这个问题确实是权限配置遗漏导致的,默认情况下普通用户无法查看部分与扩展(比如pg_cron)相关的系统参数,下面是具体的排查和解决方法:
1. 核心原因说明
PostgreSQL的pg_settings视图虽然默认对普通用户开放SELECT权限,但部分与扩展或超级用户操作相关的参数(比如cron.max_running_jobs这类pg_cron的配置项)会被权限限制,只有拥有特定系统角色的用户才能查看。
2. 快速解决:授予内置监控角色
最简单的方法是给非PostgreSQL用户授予专门读取系统设置的角色,或者更全面的监控角色:
切换到postgres用户,执行以下SQL:
-- 仅授予读取所有系统设置的权限 GRANT pg_read_all_settings TO your_non_postgres_user; -- 如果用户还需要查看其他监控数据,可授予更全面的监控角色 -- GRANT pg_monitor TO your_non_postgres_user;
授予完成后,切换到目标用户重新执行查询:
SELECT * FROM pg_settings WHERE name = 'cron.max_running_jobs';
此时应该能正常获取到记录了。
3. 最小权限方案:创建专用视图
如果不想给用户过大的权限,可以创建一个仅包含cron.max_running_jobs的视图,再授予用户对该视图的访问权限:
-- 创建视图,仅暴露目标参数的必要字段 CREATE VIEW cron_max_running_jobs AS SELECT name, setting, unit, short_desc, context FROM pg_settings WHERE name = 'cron.max_running_jobs'; -- 授予用户对视图的SELECT权限 GRANT SELECT ON cron_max_running_jobs TO your_non_postgres_user;
之后用户可以通过查询cron_max_running_jobs视图获取该参数值,无法访问其他敏感系统设置。
4. 额外排查:确认基础SELECT权限
如果上述操作后仍无法查询,先检查用户是否拥有pg_settings的基础SELECT权限:
SELECT has_table_privilege('your_non_postgres_user', 'pg_settings', 'SELECT');
如果返回f,需要先授予基础权限:
GRANT SELECT ON pg_settings TO your_non_postgres_user;
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

