Réponses:
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 EXTENSION
n'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_path
pour 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 extensions
schéma derrière des objets du même nom (et paramètres) dans le public
schéma.
En relation:
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
. (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?
À pg_catalog
ma connaissance, l' installation d'extensions n'est pas recommandée. Vous devez utiliser le public
schéma par défaut , qui se trouve également dans le search_path
par défaut.
À titre d'exemple, je travaillerai avec l' pageinspect
extension que j'ai déjà créée dans le public
sché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 public
schéma.
Maintenant, j'essaye de le déplacer vers le pg_catalog
sché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 public
sché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 public
sché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 public
schéma, les fonctions sont toujours accessibles à tous les schémas de la base de données.
TL, DR; Utilisez simplement le public
schéma par défaut pour les extensions.
plpgsql
extension est-elle alors en quelque sorte une exception à cette règle? Chaque installation que j'ai vue a cette extension dans pg_catalog