我在 PostgresQL 9.1.1 上试图让扩展unaccent在所有模式上都可用。
所以我运行了命令CREATE EXTENSION unaccent;
。哪个有效,但仅适用于search_path
. 所以这意味着如果我更改 search_path,我将无法再调用unaccent
. 如何使此扩展可用于特定数据库中的所有模式?
提前致谢!
我在 PostgresQL 9.1.1 上试图让扩展unaccent在所有模式上都可用。
所以我运行了命令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
或使用将扩展架构包含在默认的 search_path 中alter system
有同样的问题,但@Richard Huxton 的回答导致了正确的解决方案:
create extension unaccent schema pg_catalog;
这行得通!
正如理查德所说,pg_catalog
会自动(无声地)添加到每个search_path
. 将在那里找到添加的扩展。
恕我直言,这比扩展是全局的要好得多。schema.func()
例如,我使用了很多模式。我使用架构PUBLIC
进行调试 - 一切都应该在自己的架构中。如果某些内容在 PUBLIC 中,那就错了。
在中创建扩展pg_catalog
可以保持所有架构干净,并让架构本身像核心 postgres 的一部分一样工作。
你没有。如果你愿意,你总是可以称它为完全合格的。
SELECT <schema>.<function>(...)
事实上,我相信内置函数始终可用的唯一原因是,无论你做什么,PG 都会将 pg_catalog 添加到你的 search_path 的末尾。