将PostgreSQL扩展安装到所有方案

vawmfj5a  于 2023-02-12  发布在  PostgreSQL
关注(0)|答案(3)|浏览(222)

我在PostgresQL 9.1.1上尝试让扩展unaccent在所有模式上可用。
所以我运行了CREATE EXTENSION unaccent;命令,这是有效的,但只适用于search_path上的当前模式集,这意味着如果我更改search_path,我将无法再调用unaccent,如何使这个扩展对特定数据库中的所有模式都可用?
先谢了!

dw1jzc5e

dw1jzc5e1#

CREATE EXTENSION unaccent;将扩展安装到公共模式中。要使其可用,只需包含以下内容以更改search_path:

set search_path = my_schema, public;

或者最好创建一个包含所有扩展的模式,然后总是将该模式附加到search_path。

create schema extensions;

-- make sure everybody can use everything in the extensions schema
grant usage on schema extensions to public;
grant execute on all functions in schema extensions to public;

-- include future extensions
alter default privileges in schema extensions
   grant execute on functions to public;

alter default privileges in schema extensions
   grant usage on types to public;

现在安装扩展:

create extension unaccent schema extensions;

然后使用将该模式包含在search_path中

set search_path = my_schema, extensions;

如果不想对创建的每个新数据库重复上述步骤,请在连接到template1数据库时运行上述步骤。甚至可以通过编辑postgresql.conf或使用alter system将扩展方案包含在默认search_path中

rekjcdws

rekjcdws2#

有相同的问题,但@Richard Huxton的回答导致了正确的解决方案:

create extension unaccent schema pg_catalog;

这很管用!!
正如Richard所说,pg_catalog会自动添加到每个search_path中,添加到那里的扩展会被找到。
恕我直言,如果扩展是全局的,这比schema.func()好得多。
例如,我使用了很多模式,我使用模式PUBLIC进行调试--所有的东西都应该在自己的模式中,如果有东西在PUBLIC中,那就错了。
pg_catalog中创建扩展可以保持所有模式的整洁,并让模式本身像核心postgres的一部分一样工作。

gkl3eglg

gkl3eglg3#

你不需要。如果你愿意,你可以称之为完全合格。

SELECT <schema>.<function>(...)

事实上,我相信内置函数始终可用的唯一原因是,无论您做什么,PG都会将pg_catalog添加到search_path的末尾。

相关问题