Установка расширения PostgreSQL для всех схем
Я на PostgresQL 9.1.1 пытаюсь сделать расширение unaccent доступным на всех схемах.
Итак, я запустил команду CREATE EXTENSION unaccent;
, Что работает, но только для текущей схемы, установленной на search_path
, Так что это означает, что если я изменю search_path, я больше не могу звонить unaccent
, Как сделать это расширение доступным для всех схем в конкретной базе данных?
Заранее спасибо!
3 ответа
Принятый ответ - плохой совет. Не устанавливайте расширения в 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
Был такой же вопрос, но ответ @Richard Huxton привел к правильному решению:
create extension unaccent schema pg_catalog;
Это работает!!
Как сказал Ричард, pg_catalog
автоматически добавляется (тихо) к каждому search_path
, Добавленные там расширения будут найдены.
имхо это намного лучше чем schema.func()
если расширение является глобальным.
Например, я использую много схем. Я использую схему PUBLIC
для отладки - все должно быть в собственной схеме. Если что-то в ПУБЛИЧНОМ, это неправильно.
Создание расширения в pg_catalog
поддерживает чистоту всей схемы и позволяет самой схеме работать так, как если бы она была частью ядра postgres.
Вы не Вы всегда можете назвать это полностью квалифицированным, если хотите.
SELECT <schema>.<function>(...)
Фактически, я считаю, что единственная причина, по которой встроенные функции всегда доступны, заключается в том, что PG добавляет pg_catalog в конец вашего search_path независимо от того, что вы делаете.