Установка расширения PostgreSQL для всех схем
Я на PostgresQL 9.1.1 пытаюсь получить расширение unaccent, доступное для всех схем.
Итак, я выполнил команду CREATE EXTENSION unaccent;
. Это работает, но только для текущей схемы, установленной на search_path
. Таким образом, это означает, что если я изменил путь search_path, я больше не могу вызвать unaccent
. Как сделать это расширение доступным для всех схем в конкретной базе данных?
Спасибо заранее!
Ответы
Ответ 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 в конец вашего пути поиска, независимо от того, что вы делаете.