xeh*_*puk 3 postgresql postgresql-9.6
我想做这样的事情:
SELECT *
FROM information_schema.tables
WHERE table_schema IN (search_path)
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到任何内容。是否可以?如何?
pg_settings
是一个系统视图,包含当前上下文中可用的所有配置选项及其值:
视图 pg_settings 提供对服务器运行时参数的访问。它本质上是 SHOW 和 SET 命令的替代接口。它还提供对有关每个参数的一些事实的访问,这些事实不能从 SHOW 直接获得,例如最小值和最大值。
您可以像任何其他视图一样查询此视图,因此您可以获得如下值search_path
:
SELECT setting FROM pg_settings WHERE name = 'search_path';
Run Code Online (Sandbox Code Playgroud)
返回值为 a text
,分隔符为', '
。需要进行一些修改,以便您可以table_schema
与此进行比较:
SELECT *
FROM information_schema.tables
WHERE table_schema = ANY (SELECT unnest(string_to_array(setting, ', '))
FROM pg_settings
WHERE name = 'search_path');
Run Code Online (Sandbox Code Playgroud)
这仍然只是一半完美,就像"$user"
在search_path
. 解决此问题的一种方法是将其替换为当前用户,例如
... replace(setting, '"$user"', CURRENT_USER) ...
Run Code Online (Sandbox Code Playgroud)
在DBFiddle上查看所有这些工作。