web-dev-qa-db-fra.com

Postgresql: Vérifier si le schéma existe?

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?

49
Chris Cashwell

La requête suivante vous dira si un schéma existe.

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
75
Peter Eisentraut

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

querying information_schema

Si vous interrogez directement pg_namespace:

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

Le travail de Planer est beaucoup plus simple:

enter image description here

Alors votre propre solution était la meilleure .

48
Borys

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
$$;
16
Glenn

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
8
Vinay

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.

1
Tay Ray Chuan

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….

VOIR LIEN ICI:http://social.msdn.Microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238-305e-40d5-858e -0fbd70454810

0
Junior Chester

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.

0
m0meni

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
Broken_Window