我正在使用PostgresQL 9.1.1尝试在所有模式上使用扩展名unaccent。
所以我运行了命令CREATE EXTENSION unaccent;
。哪个有效,但仅适用于search_path
上设置的当前架构。所以这意味着如果我更改search_path,我就不能再调用unaccent
了。如何使此扩展可用于特定数据库中的所有模式?
提前致谢!
答案 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
答案 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的末尾,无论你做什么。