Postgres: 修改现有的 search_path(保留当前值)

有时候我想要扩展现有的搜索路径,而不是替换它,比如说: 首先假设它已经设置好了,像这样:
SET search_path TO schema_b, schema_c, public;
我想把我的模式添加到队列的前面。
SET search_path TO schema_a + search_path;   --doesn't work
我在思考类比于我在BASH中会做的事情。
PATH=path_a:$PATH
奖励问题,也许相关:有没有办法我可以临时存储当前路径,这样我就可以将其更改为完全不同的内容,然后在不知道原来路径的情况下恢复它?
4个回答

SELECT set_config('search_path', 'fred,'||current_setting('search_path'), false);

false表示这不是一个事务-LOCAL设置。

对于奖励问题,您可以将值存储在自定义设置中:

SELECT set_config('tmp.search_path', current_setting('search_path'), false);
从9.2版本开始,你甚至不需要在postgresql.conf中定义这个设置。

这似乎只是暂时的,有没有办法可以持续地做到这一点? - vrms
或许可以将SELECT set_cont('search_path')作为子查询在ALTER USER name SET search_path ...中使用的一种方法。 - vrms

An error occurred:

marked(): input parameter is undefined or null
Please report this to https://github.com/markedjs/marked.
- undefined

另一种方法是通过两步程序来最初设置search_path
\set my_path schema_b, schema_c, public
set search_path to :my_path;
然后,每当你想要扩展search_path时,就像这样做:
\set my_path schema_a, :my_path
set search_path to :my_path;

这不允许存储现有的 search_path 值。


使用9.3特定的\gset psql命令是一种不错的方式。
SELECT current_setting('search_path') AS my_path \gset
set search_path to schema_a, :my_path;
的文档可以在这里找到,并且在depesz.com上有很好的演示。 由于我无法访问9.3版本的实例,所以无法测试此功能。如果有人能够确认按照我所描述的方式工作,我将非常感激。谢谢!

从Craig Ringer的答案中改编:如果你想检查不同的值,使用以下查询:
SELECT set_config('search_path', '"$user", mview,'||ARRAY_TO_STRING(
    ARRAY(
        SELECT DISTINCT elem FROM
        UNNEST(
            STRING_TO_ARRAY(
            REPLACE(
                current_setting('search_path'), ' ', '')
            , ',')) elem
        WHERE elem <> '"$user"')
    ,','), false);

它将确保:

  • "$user" 总是在搜索路径的开头
  • 搜索路径中没有重复的条目
  • 在计算独特计数时移除空格
  • mview 替换为您选择的新搜索路径条目