Est-il recommandé d'installer des extensions dans le schéma pg_catalog?

Réponses:

16

Ne pas installer les extensions à pg_catalog( à moins que c'est leur défaut: très peu extensions sont conçues de cette façon), parce que vous ne salissez pas avec le catalogue système, jamais . @Chris démontre une des raisons pour lesquelles. Il y en a d'autres.

Cependant, le schéma "public" n'est en rien spécial . C'est juste le schéma par défaut qui est pré-installé dans les distributions standard afin que nous puissions commencer immédiatement. Certains administrateurs DB n'utilisent pas du tout le schéma "public", certains le suppriment même.

CREATE EXTENSIONn'est pas affilié au schéma "public". Il s'installe dans le schéma actuel sauf indication contraire - sauf que certaines extensions ont un schéma prédéfini (comme PGQ / Londiste ). La documentation:

nom_schéma

Nom du schéma dans lequel installer les objets de l'extension, étant donné que l'extension permet de déplacer son contenu. Le schéma nommé doit déjà exister. S'il n'est pas spécifié et que le fichier de contrôle de l'extension ne spécifie pas non plus de schéma, le schéma de création d'objet par défaut actuel est utilisé .

N'oubliez pas que l'extension elle-même n'est pas considérée comme faisant partie d'un schéma: les extensions ont des noms non qualifiés qui doivent être uniques à l'échelle de la base de données. Mais les objets appartenant à l'extension peuvent se trouver dans des schémas.

Accentuation sur moi.
Décidez comment gérer les utilisateurs, les schémas et search_path:

Décidez ensuite où installer les extensions. Vous pouvez installer sur n'importe quel schéma de votre choix et inclure ce schéma par défaut search_pathpour tous les utilisateurs ou seulement pour certains ou aucun utilisateur (de sorte que des références qualifiées soient requises). Tout dépend de ce que vous voulez réaliser.
Quoi que vous fassiez, restez cohérent.

J'aime installer des extensions (qui le permettent) dans un schéma "d'extensions" dédié, que j'inclus par défaut search_path après "public" (et "$ user" - si vous l'utilisez). Aide à une séparation nette de mes propres fonctions publiques et d'autres objets publics. Ma mise en postgresql.conf:

search_path = "$user",public,extensions

Ou:

search_path = public,extensions

Et j'installe des extensions avec:

CREATE EXTENSION some_extension SCHEMA extensions;

Une chose à noter: De cette façon, vous pouvez "masquer" des objets (non qualifiés) dans le extensionsschéma derrière des objets du même nom (et paramètres) dans le publicschéma.

En relation:

Erwin Brandstetter
la source
ok l' plpgsqlextension est-elle alors en quelque sorte une exception à cette règle? Chaque installation que j'ai vue a cette extension dans pg_catalog
zam6ak
@ zam6ak: Oui, plpgsql est un peu un cas particulier: Citant le manuel :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.
Erwin Brandstetter
1
plv8 s'installe également sur pg_catalog. (Il génère une erreur si vous essayez de le modifier.) Est-ce peut-être une norme pour l'installation d'extensions de langage procédural pour les fonctions?
jpmc26
6

À pg_catalogma connaissance, l' installation d'extensions n'est pas recommandée. Vous devez utiliser le publicschéma par défaut , qui se trouve également dans le search_pathpar défaut.

Pourquoi?

À titre d'exemple, je travaillerai avec l' pageinspectextension que j'ai déjà créée dans le publicschéma. Toutes les fonctions sont, par défaut, accessibles à tous les schémas de la base de données si elles se trouvent dans le publicschéma.

Maintenant, j'essaye de le déplacer vers le pg_catalogschéma, en utilisant

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

et ça marche très bien.

Mais...

Essayez de le déplacer à nouveau, revenez au publicschéma en utilisant

ALTER EXTENSION pageinspect SET SCHEMA public;

et il ne le permettra pas, produisant l'erreur suivante

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

Euh oh! Eh bien, ça va que ça ne me laisse pas bouger. Je peux simplement le remettre dans le publicschéma en le supprimant et en le recréant, non? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

OK bien. De retour au bon endroit dans le publicschéma, les fonctions sont toujours accessibles à tous les schémas de la base de données.

TL, DR; Utilisez simplement le publicschéma par défaut pour les extensions.

Chris
la source