Установка расширения 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 независимо от того, что вы делаете.

Другие вопросы по тегам