2012-10-20 18 views
12

我在PostgresQL 9.1.1上试图让扩展unaccent适用于所有模式。将PostgreSQL扩展安装到所有模式

所以我跑命令CREATE EXTENSION unaccent;。哪些工作,但只适用于在search_path上设置的当前模式。所以这意味着如果我改变search_path,我不再可以调用unaccent。如何让这个扩展可用于特定数据库中的所有模式?

在此先感谢!

回答

17

接受的答案是不好的意见。做不是安装扩展到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

+0

这正是我使用的模型。 – klin

+0

你说得对。但是,我个人不会使用PUBLIC模式,因为我发现它是恶业。如果PUBLIC模式中有任何内容,它不应该存在,并且我的脚本中存在一个错误。 –

+0

@ccyoung:我没有透露任何有关公共模式是“好”还是“坏”的问题,我只是将它包括在内,以便与默认配置兼容。但是,公共架构绝对没有特别之处,没有任何理由避免它。如果你认为这是“糟糕的业障”,你还没有理解Postgres中的模式是如何工作的。另一方面,搞乱'pg_catalog'是一个真正的不行,并且是一个非常糟糕的建议 –

10

你不知道。如果你愿意,你可以随时称其完全合格。

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

事实上,我认为唯一的原因内置的功能都可以是PG增加了pg_catalog您SEARCH_PATH结束,不管你做什么。

+0

感谢richard将默认search_path中的扩展架构包含在内。这确实有道理。你是个聪明人。 – Clash

+0

不确定我可以保持一个正直的面孔,并声称是“明智的”:-) –

+2

重要提示l:'pg_catalog'被添加为* search_path'的第一个***项目之前任何其他架构(可以通过在'search_path'中明确提及'pg_catalog'来改变)。任何其他方法将是不明智的:http://stackoverflow.com/questions/25068040/when-how-are-default-value-expression-functions-bound-with-regard-to-search-pa/25068681#25068681该手册:http://www.postgresql.org/docs/current/interactive/ddl-schemas.html#DDL-SCHEMAS-PATH –

13

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

create extension unaccent schema pg_catalog; 

这个作品!

正如Richard所说,pg_catalog会自动添加(静默)到每个search_path。添加的扩展将会被找到。

恕我直言,这是schema.func()如果扩展为全球性更好。

例如,我使用了很多模式。我使用架构PUBLIC进行调试 - 所有东西都应该在自己的模式中。如果某件事在PUBLIC中,那就错了。

pg_catalog中创建扩展可以保持所有模式的清洁,并让模式本身工作,就好像它是核心postgres的一部分一样。

+6

我强烈建议创建一个新的'unaccent'模式并在其中创建它,然后将该模式添加到'search_path'。清理器避免与系统目录混淆,并将其放入新的模式并不会阻止您将其放在搜索路径上。 –

+0

@CraigRinger - 我可以欣赏你在说什么。现在,我通常为不同的客户端使用相同的应用程序或使用相同服务器的兄弟应用程序的不同模式你所建议的是创建一个仅用于命名目的的模式,类似于node.js中的模块。如果在整个代码中一致地执行了这个操作,例如'schema.fn()',就像在node.js中一样,那么就不需要添加到搜索路径中。我会高度赞成这种做法。但由于这不是在扩展本身中完成的,它只是没有发生。 –

+4

这是一个不好的建议。 –