如何查询PostgreSQL中通过set_config()设置的所有配置变量?
如何查询所有通过set_config()设置的PostgreSQL变量
哦,这个场景我太有共鸣了——刚从Oracle转PostgreSQL的时候,因为对PL/pgSQL的会话级变量实现不太熟,很容易就靠set_config()来模拟PL/SQL包的全局变量,结果后面这些自定义配置项散得哪儿都是,找起来真的头疼。下面给你几个实用的方法:
1. 查询PostgreSQL的系统视图pg_settings
所有通过set_config()设置的变量(不管是临时会话级还是持久化的)都会存在pg_settings视图里。你可以通过过滤上下文和命名规则来筛选出自定义的变量:
SELECT name, setting, context, source FROM pg_settings -- 只保留会话/用户级的配置(set_config默认是session级) WHERE context IN ('session', 'user') -- 排除PostgreSQL内置的以pg_开头的参数(如果你的自定义变量没用到这个前缀的话) AND name NOT LIKE 'pg_%' ORDER BY name;
context列标记了变量的生效范围,session就是当前会话有效,user是对当前用户所有会话有效source列如果是user,说明这个变量是通过set_config()或者SET命令设置的
如果你们团队给自定义变量统一加了前缀(比如app_或者proj_),可以直接用这个前缀过滤,更精准:
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'app_%' AND context IN ('session', 'user');
2. 搜索代码库中的set_config()调用
既然这些变量都是在代码里设置的,直接搜代码是最彻底的方式,能找到所有被设置的变量名,包括那些可能只在特定会话中临时设置、当前没生效的变量。
用命令行工具搜索(Linux/macOS)
在你的PL/pgSQL代码目录下执行:
# 搜索所有包含set_config的文件 grep -r "set_config" /path/to/your/pgsql/code # 只提取去重后的变量名(更高效) grep -o "set_config('.*'" /path/to/your/pgsql/code | cut -d"'" -f2 | sort | uniq
Windows下用findstr
findstr /s "set_config" C:\path\to\your\pgsql\code
3. 注意事项
- 如果你的
set_config()调用没有加第三个参数is_local为true(即set_config('var', 'val', true)),这些变量只会在当前会话生效,重启会话或数据库后就会消失,这时候pg_settings里只能查到当前会话已设置的变量 - 有些变量可能是动态生成的(比如用变量拼接参数名),这种情况文本搜索可能漏查,需要结合代码逻辑排查
内容的提问来源于stack exchange,提问作者Ivan C
相关产品推荐
相关产品推荐

