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?

47
demandé sur roufamatic 2011-08-10 23:14:19

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';
72
répondu Peter Eisentraut 2011-08-11 06:44:06

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');

interroger information_schema

Si vous interrogez directement pg_namespace:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');

Le travail de raboteuse est beaucoup plus simple:

entrez la description de l'image ici

Donc, votre propre solution était la meilleure.

43
répondu Borys 2016-08-12 11:57:42

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
$$;
14
répondu Glenn 2012-12-01 02:02:07

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
8
répondu Vinay 2011-08-10 19:22:24

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.

1
répondu Tay Ray Chuan 2012-07-31 09:50:05

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

0
répondu Junior Chester 2012-01-30 07:25:10

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')
0
répondu Broken_Window 2014-03-11 16:17:51

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.

0
répondu m0meni 2016-06-27 19:26:52