我在Postgresql 9.1.1尝试使所有架构上的扩展名都无法使用。
所以我运行了命令CREATE EXTENSION unaccent;
。它有效,但仅适用于search_path
上的当前架构。因此,这意味着,如果我更改search_path,我将不再可以调用unaccent
。如何使此扩展名可用于特定数据库中的所有模式?
预先感谢!
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
也有同样的问题,但是@richard huxton答案导致了正确的解决方案:
create extension unaccent schema pg_catalog;
这有效!
正如理查德所说,pg_catalog
自动添加到每个search_path
中。将找到添加的扩展。
imho这比 schema.func()
好,如果 扩展是全局。
例如,我使用了很多模式。我使用架构PUBLIC
进行调试 - 一切都应该在其自己的架构中。如果在公开场合发生了什么事,那是错误的。
在pg_catalog
中创建扩展程序可以保持所有模式清洁,并让模式本身好像它是Core Postgres的一部分。
您不这样做。如果您愿意,您可以随时将其称为完全资格。
SELECT <schema>.<function>(...)
实际上,我相信内置函数始终可用的唯一原因是,无论您做什么,PG都会将PG_CATALOG添加到search_path的末尾。