43

我在 PostgresQL 9.1.1 上试图让扩展unaccent在所有模式上都可用。

所以我运行了命令CREATE EXTENSION unaccent;。哪个有效,但仅适用于search_path. 所以这意味着如果我更改 search_path,我将无法再调用unaccent. 如何使此扩展可用于特定数据库中的所有模式?

提前致谢!

4

3 回答 3

74

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或使用将扩展架构包含在默认的 search_path 中alter system

于 2017-05-12T11:55:50.847 回答
19

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

create extension unaccent schema pg_catalog;

这行得通!

正如理查德所说,pg_catalog会自动(无声地)添加到每个search_path. 将在那里找到添加的扩展。

恕我直言,这比扩展是全局的好得多。schema.func()

例如,我使用了很多模式。我使用架构PUBLIC进行调试 - 一切都应该在自己的架构中。如果某些内容在 PUBLIC 中,那就错了。

在中创建扩展pg_catalog可以保持所有架构干净,并让架构本身像核心 postgres 的一部分一样工作。

于 2013-04-21T06:40:44.390 回答
14

你没有。如果你愿意,你总是可以称它为完全合格的。

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

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

于 2012-10-20T09:13:54.417 回答