Поскольку объекты в pg_catalog
схеме неявно находятся в search_path
( документах ), рекомендуется ли устанавливать расширения в этой схеме?
Поскольку объекты в pg_catalog
схеме неявно находятся в search_path
( документах ), рекомендуется ли устанавливать расширения в этой схеме?
Ответы:
Не устанавливайте расширений 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
схеме.
Связанные с:
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.
pg_catalog
. (Выдает ошибку, если вы пытаетесь ее изменить.) Возможно, это стандарт для установки расширений процедурного языка для функций?
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
схему по умолчанию для расширений.
plpgsql
расширение тогда как-то исключение из этого правила? Каждая установка, которую я видел, имеет это расширение в pg_catalog