将 search_path 重置为全局、集群默认值

jpm*_*c26 3 postgresql configuration

search_path假设我像这样永久更改我的数据库:

ALTER DATABASE my_db SET search_path TO "$user",public,other_schema;
Run Code Online (Sandbox Code Playgroud)

如何将其重置回该集群上原始的、未更改的数据库所具有的默认值?

这通常是这样"$user",public,但可以通过配置文件进行更改。有一种方法可以读取来自配置文件的参数值(因此我可以在最坏的情况下构建动态查询),但我没有找到任何类似的东西。

Erw*_*ter 5

出厂默认值

\n
\n

如何将其重置回该集群上原始的、未经更改的数据库所具有的默认值?

\n
\n

您可以boot_val从 中读取pg_settings,但这实际上是编译的出厂默认值,而不是 中的设置postgresql.conf

\n
SELECT boot_val\nFROM   pg_settings\nWHERE  name LIKE \'search_path\';\n
Run Code Online (Sandbox Code Playgroud)\n

您没有忽略简单的事情吗RESET

\n

重置设置(将其删除),您可以简单地:

\n
ALTER DATABASE my_db RESET search_path;\n
Run Code Online (Sandbox Code Playgroud)\n

但这并不一定会给您带来“这个集群上原始的、未更改的数据库所拥有的”。它只是删除数据库的自定义设置。设置搜索路径有多种方法:

\n\n

并且它不会改变search_path当前会话的。效果(如果有的话)将在您的下一次训练中可见。

\n

有关的:

\n\n

连接到template1

\n

可以从连接获取当前设置template1,就像@Abelisto 建议的那样。但您可能想留在当前会话中。您可以使用 dblink 来实现:

\n
SELECT * FROM dblink(\'hostaddr=127.0.0.1 dbname=template1 user=postgres password=you_wish\'\n                         , $$SELECT boot_val, source FROM pg_settings\n                             WHERE name LIKE \'search_path\'$$\n                          ) AS t(search_path text, source text);\n\nsearch_path    | source\n---------------+---------\n"$user",public | default\n
Run Code Online (Sandbox Code Playgroud)\n

这有几个挑战

\n
    \n
  • 您需要安装附加模块dblink。这很简单:

    \n
  • \n
  • 即使函数中止,也会在 UDF 中持久插入

    \n
  • \n
  • 您需要有连接到 的权限template1。并且您需要提供用户密码。

    \n
  • \n
  • 即使在template1设置中也可能源于角色或数据库(或另一个实例)的设置(即使它们可能不是)。所以检查列source。如果它显示“默认”,那么你就明白了。如果显示“数据库”“用户”您将回到第 1 方...

    \n
  • \n
\n

读取实际设置postgresql.conf

\n

..使用pg_read_file(),但这也受到一些重要的限制手册

\n
\n

这些功能的使用仅限于超级用户

\n
\n

和:

\n
\n

只能访问数据库集群目录及其中的文件。log_directory

\n
\n

大胆强调我的。
\n如果您的配置文件位于其他位置(例如 Debian 及其朋友上的默认安装),您必须在数据或日志目录的文件系统中创建指向实际配置文件的符号链接。

\n
SELECT substring(txt, $$\\nsearch_path\\s*=\\s*\'([^\']+)\'$$) AS search_path\nFROM   pg_read_file((SELECT setting FROM pg_settings WHERE name = \'config_file\')\n                  , 0, 10000000) AS txt;  -- arbitrary 10 MB max.\n\nsearch_path\n------------\npublic\n
Run Code Online (Sandbox Code Playgroud)\n

请注意我如何动态获取配置文件的路径:

\n
SELECT setting FROM pg_settings WHERE name = \'config_file\'\n
Run Code Online (Sandbox Code Playgroud)\n

然后我使用带有 substring() 的正则表达式来提取设置:

\n
\\nsearch_path\\s*=\\s*\'([^\']+)\'\n
Run Code Online (Sandbox Code Playgroud)\n

这应该可行,不过我没有花太多时间来使正则表达式防弹。可能会被第一个匹配的注释设置所愚弄。您可能想进行更多测试。

\n

最后,从 Postgres 9.4 开始,还有ALTER SYSTEM覆盖文件中设置的命令postgresql.auto.conf。你也必须检查一下。

\n