82 votes

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

Je dois créer, gérer et supprimer des schémas à la volée. Si je crée un schéma qui existe déjà, je veux (de manière conditionnelle, 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 ça :

select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');

mais j'ai l'impression qu'il existe probablement un autre moyen... est-ce la façon "correcte" d'interroger Postgres sur l'existence d'un schéma particulier ?

20 votes

Pour les futurs visiteurs : La prochaine version de Postgres 9.3 aura une create schema if not exists

123voto

Peter Eisentraut Points 12513

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

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';

18 votes

Merci, c'était une excellente réponse. Voici comment je l'ai étendu pour qu'il fonctionne parfaitement pour mes besoins : SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo');

0 votes

Comment vérifier cela en c# ? Si j'utilise "ExecuteReader", il affiche 1 pour toutes les requêtes.

0 votes

Utilisez ExecuteScalar pour obtenir le retour de true ou false.

70voto

Borys Points 456

Si vous êtes un puriste total ou si vous voulez gagner quelques milisecs. Je vous recommande d'utiliser le catalogue système natif de postgres. On peut ainsi éviter 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');

querying information_schema

Si vous interrogez pg_namespace directement :

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

Le travail des raboteurs est beaucoup plus simple :

enter image description here

Alors votre propre solution était la meilleure .

33voto

Glenn Points 4638

Quelque peu lié et peut-être intéressant pour d'autres personnes cherchant à créer des schémas conditionnels. 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
$$;

1 votes

C'est la meilleure solution qui soit ! :-)

11voto

Vinay Points 563

Cela peut être l'une des approches. Déposer le schéma d'abord et le créer ensuite.

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

0 votes

Oui, mais supposons que je veuille avoir une étape entre les deux ? c'est-à-dire : est-ce que le schémaXYZ existe ? Oui : contient-il X ? Non : laisser tomber et créer ; Oui : sauter de la fonction

0 votes

Pendant ce temps, nous devrons faire le select exists(...).J'ai trouvé un couple de liens avec la même exigence. Ils disent aussi la même chose :) postgresql.1045698.n5.nabble.com/ -- PostgreSQL social.msdn.microsoft.com/forums/en-US/transactsql/thread/ --- SQL Server

0 votes

Voir si quelque chose jette une erreur pour vérifier une condition simple, est une approche terrible, quand il y a tant de façons de vérifier un schéma, comme d'autres l'ont noté.

9voto

gyosifov Points 100

Si vous voulez créer un schéma s'il n'existe pas, vous pouvez simplement l'exécuter :

CREATE SCHEMA IF NOT EXISTS foo

Source : https://www.postgresql.org/docs/current/sql-createschema.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X