Рекомендуется ли устанавливать расширения в схему pg_catalog?

Ответы:

16

Не устанавливайте расширений pg_catalog(если это не их по умолчанию: очень немногие расширения разработаны таким образом), потому что вы не запутались с каталогом системы, когда - либо . @ Крис демонстрирует одну причину почему. Есть и другие.

Однако «публичная» схема ни в коем случае не является особенной . Это просто схема по умолчанию, которая предварительно установлена ​​в стандартных дистрибутивах, поэтому мы можем сразу приступить к работе. Некоторые администраторы БД вообще не используют "публичную" схему, некоторые даже удаляют ее.

CREATE EXTENSIONне связан с "публичной" схемой. Он устанавливается в текущую схему, если не указано иное, за исключением того, что некоторые расширения имеют предустановленную схему (например, PGQ / Londiste ). Документация:

schema_name

Имя схемы для установки объектов расширения, учитывая, что расширение позволяет перемещать его содержимое. Указанная схема уже должна существовать. Если не указан, а управляющий файл расширения также не указывает схему, используется текущая схема создания объекта по умолчанию .

Помните, что само расширение не считается входящим в какую-либо схему: расширения имеют неквалифицированные имена, которые должны быть уникальными для всей базы данных. Но объекты, принадлежащие расширению, могут находиться в схемах.

Жирный акцент мой.
Решите, как управлять пользователями, схемами и search_path:

Затем решите, где установить расширения. Вы можете установить любую схему по вашему выбору и включить эту схему в настройки search_pathпо умолчанию для всех пользователей или только для некоторых или вообще не использовать пользователей (поэтому требуются квалифицированные ссылки). Все зависит от того, чего вы хотите достичь.
Что бы вы ни делали, оставайтесь последовательными.

Мне нравится устанавливать расширения (которые позволяют это) в выделенной схеме «расширений», которую я включаю в значение search_path по умолчанию после «public» (и «$ user» - если вы используете это). Помогает с чистым разделением моих публичных функций и других публичных объектов. Мои настройки в postgresql.conf:

search_path = "$user",public,extensions

Или:

search_path = public,extensions

И я устанавливаю расширения с:

CREATE EXTENSION some_extension SCHEMA extensions;

Стоит отметить: таким образом вы можете «скрыть» (неквалифицированные) объекты в extensionsсхеме за объектами с тем же именем (и параметрами) в publicсхеме.

Связанные с:

Эрвин Брандштеттер
источник
ок, plpgsqlрасширение тогда как-то исключение из этого правила? Каждая установка, которую я видел, имеет это расширение в pg_catalog
zam6ak
@ zam6ak: Да, plpgsql - это особый случай: цитирование руководства :In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Эрвин Брандштеттер,
1
plv8 тоже устанавливает себя pg_catalog. (Выдает ошибку, если вы пытаетесь ее изменить.) Возможно, это стандарт для установки расширений процедурного языка для функций?
jpmc26
6

pg_catalogНасколько я знаю, устанавливать расширения в не рекомендуется. Вы должны использовать publicсхему по умолчанию , которая также есть в search_pathпо умолчанию.

Почему?

В качестве примера я буду работать с pageinspectрасширением, которое я уже создал в publicсхеме. Все функции по умолчанию доступны для всех схем в базе данных, если они находятся в publicсхеме.

Теперь я пытаюсь переместить его в pg_catalogсхему, используя

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

и это работает просто отлично.

Но...

Попробуйте переместить его снова, вернуться к publicсхеме, используя

ALTER EXTENSION pageinspect SET SCHEMA public;

и это не позволит, приводя к следующей ошибке

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

Ой! Ну, это нормально, что это не позволит мне переместить это. Я могу просто вернуть его обратно в publicсхему, отбросив его и воссоздав, верно? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

Хорошо. Вернитесь в правильное место в publicсхеме, и функции по-прежнему доступны для всех схем в базе данных.

TL, DR; Просто используйте publicсхему по умолчанию для расширений.

Крис
источник