You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:14:31