将PostgreSQL扩展安装到所有架构中



我在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

在默认search_path中包含扩展名架构

也有同样的问题,但是@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的末尾。

最新更新