将PostgreSQL扩展安装到所有模式

时间:2012-10-20 07:37:32

标签: postgresql

我正在使用PostgresQL 9.1.1尝试在所有模式上使用扩展名unaccent

所以我运行了命令CREATE EXTENSION unaccent;。哪个有效,但仅适用于search_path上设置的当前架构。所以这意味着如果我更改search_path,我就不能再调用unaccent了。如何使此扩展可用于特定数据库中的所有模式?

提前致谢!

3 个答案:

答案 0 :(得分:38)

接受的答案是糟糕建议。 pg_catalog架构中安装扩展程序。

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中添加扩展架构

答案 1 :(得分:17)

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

create extension unaccent schema pg_catalog;

这有效!!

正如理查德所说,pg_catalog会自动添加(静默)到每个search_path。添加的扩展程序将被找到。

如果扩展程序是全局的,

例如,我使用了很多模式。我使用模式schema.func()进行调试 - 一切都应该在自己的模式中。如果有什么东西在PUBLIC中,那就错了。

PUBLIC中创建扩展可以保持所有架构的清洁,并让架构本身就像它是核心postgres的一部分一样。

答案 2 :(得分:11)

你没有。如果您愿意,可以随时将其称为完全合格。

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

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