Postgresql: vérifier si le schéma existe?
Je dois 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, via 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 y a probablement un autre moyen... est-ce la "bonne" façon d'interroger Postgres pour l'existence d'un schéma?
8 réponses
La requête suivante vous indiquera 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 postgres. On peut éviter alors la boucle imbriquée qui est causée par l'appel de pg_catalog de toute façon...
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 raboteuse est beaucoup plus simple:
Donc, votre propre solution était la meilleure.
Quelque peu lié et peut-être intéressant pour d'autres à la recherche de création de schéma conditionnel. Je me suis retrouvé à utiliser du 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. Déposer le schéma, puis le créer.
IF EXISTS:
Do not throw an error if the schema does not exist. A notice is issued in this case.
Donc,
DROP SCHEMA IF EXISTS schema_Name
Create SCHEMA schema_Name
Depuis http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (soulignement le mien):
Le schéma de vue contient tous les schémas de la base de données actuelle qui appartiennent à un rôle actuellement activé.
Donc, votre solution/requête originale est 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 échouera pendant la chute...
Créer et gérer est la partie la plus facile.. C'est la goutte d'eau qui va vous arriver.. Quoi qu'il en soit, je ne pouvais pas trouver une réponse appropriée, alors j'ai posté ici pour les autres..
VOIR le LIEN ICI: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-858e-0fbd70454810
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')
Utiliser
SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname');
Si vous cochez la case https://www.postgresql.org/docs/current/static/infoschema-schemata.html, vous voyez
Le schéma de vue 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 ayant des privilèges).
Cela signifie que la requête dans la réponse acceptée en utilisant 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 indépendamment du fait que vous ayez ou non accès au schéma.