Подтвердить что ты не робот

Установка расширения PostgreSQL для всех схем

Я на PostgresQL 9.1.1 пытаюсь получить расширение unaccent, доступное для всех схем.

Итак, я выполнил команду CREATE EXTENSION unaccent;. Это работает, но только для текущей схемы, установленной на search_path. Таким образом, это означает, что если я изменил путь search_path, я больше не могу вызвать unaccent. Как сделать это расширение доступным для всех схем в конкретной базе данных?

Спасибо заранее!

4b9b3361

Ответ 1

Принятый ответ - это плохой совет. Не устанавливайте расширения не в схему 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

Ответ 2

Имел такой же вопрос, но ответ @Richard Huxton привел к правильному решению:

create extension unaccent schema pg_catalog;

Это работает!!

Как сказал Ричард, pg_catalog автоматически добавляется (тихо) к каждому search_path. Добавленные там расширения будут найдены.

imho это намного лучше, чем schema.func(), если расширение глобально.

Например, я использую много схем. Я использую схему PUBLIC для отладки - все должно быть в собственной схеме. Если что-то находится в PUBLIC, это неправильно.

Создание расширения в pg_catalog сохраняет всю схему чистой и позволяет самой схеме работать так, как если бы она была частью основных postgres.

Ответ 3

Нет. Вы всегда можете назвать его полностью квалифицированным, если хотите.

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

Фактически, я считаю, что единственная причина, по которой встроенные функции всегда доступны, - это то, что PG добавляет pg_catalog в конец вашего пути поиска, независимо от того, что вы делаете.