J'ai besoin de créer, gérer et supprimer des schémas à la volée. Si je vais créer un schéma qui existe déjà, je veux (conditionnellement, par des moyens externes) le supprimer et le recréer comme spécifié. Comment puis-je vérifier l'existence de ce schéma sur mon serveur Postgres 9?
Actuellement, je fais ceci:
select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
mais j’ai l’impression qu’il existe probablement une autre méthode ... c’est la méthode "appropriée" pour interroger Postgres sur l’existence d’un schéma particulier?
La requête suivante vous dira si un schéma existe.
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
Si vous êtes un puriste total ou si vous voulez gagner des milisecs. Je vous recommande d'utiliser le catalogue système natif de Postgres. On peut alors éviter la boucle imbriquée qui est quand même appelée en appelant pg_catalog ...
SELECT EXISTS(SELECT 1 FROM information_schema.schemata
WHERE schema_name = 'name');
Si vous interrogez directement pg_namespace:
SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');
Le travail de Planer est beaucoup plus simple:
Alors votre propre solution était la meilleure .
Un peu lié et peut-être intéressant aux autres à la recherche de création de schéma conditionnel. Je me suis retrouvé à utiliser un code comme celui-ci dans certains de mes scripts de création:
DO $$
BEGIN
IF NOT EXISTS(
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name = 'pgcrypto'
)
THEN
EXECUTE 'CREATE SCHEMA pgcrypto';
END IF;
END
$$;
Cela peut être l'une des approches. Commencez par déposer le schéma, puis créez-le.
IF EXISTS:
Do not throw an error if the schema does not exist. A notice is issued in this case.
Alors,
DROP SCHEMA IF EXISTS schema_Name
Create SCHEMA schema_Name
De http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (c'est moi qui souligne):
La vue schemata contient tous les schémas de la base de données actuelle qui appartiennent à un rôle actuellement activé.
Votre solution/requête initiale est donc plus fiable que celle de Peter, bien que non standard.
Aucun de ceux-ci ne fonctionnera si vous avez des objets (tables, sprocs, vues) dans un schéma particulier - IL VA ÉCHEC pendant DROP ...
CRÉER ET GÉRER est la partie la plus facile… C'est la goutte qui vous mènera… De toute façon, je ne trouvais pas de réponse appropriée, alors j'ai posté ici pour les autres….
Utilisation
SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname');
Si vous vérifiez https://www.postgresql.org/docs/current/static/infoschema-schemata.html , vous voyez
La vue schemata contient tous les schémas de la base de données actuelle auxquels l'utilisateur actuel a accès (en tant que propriétaire ou disposant de certains privilèges).
Cela signifie que la requête dans la réponse acceptée à l'aide de information_schema.schemata
ne montre pas les schémas dont l'utilisateur actuel n'est pas le propriétaire ou n'a pas le privilège USAGE
sur.
SELECT 1
FROM pg_catalog.pg_namespace
WHERE nspowner <> 1 -- ignore tables made by postgres itself
AND nspname = 'schemaname';
est plus complet et montrera tous les schémas existants que postgres n’a pas créés, que vous ayez ou non accès au schéma.
Celui-ci a fonctionné pour moi (Postgres 9.3):
Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')