2016-06-01 1 views
2

Je veux vérifier l'existence de toutes mes tables. Envoyer 1 si toutes les tables existent ou 0 si une table ou plus est manquante.Comment vérifier les existences de toutes mes tables? dans postgresql

select 1 from information_schema.tables tbl where tbl.table_name='graphe'; 
select 1 from information_schema.tables tbl where tbl.table_name='proprieteindicateur'; 
select 1 from information_schema.tables tbl where tbl.table_name='graphe_proprieteindicateur'; 
select 1 from information_schema.tables tbl where tbl.table_name='utilisateurs'; 
select 1 from information_schema.tables tbl where tbl.table_name='profil'; 
select 1 from information_schema.tables tbl where tbl.table_name='droit'; 
+0

Toute raison pour laquelle vous ne pouvez remplacer le "1" avec mention "count()" et utiliser le "IN" avec une liste de noms de table? Si vous le pouvez, créez une fonction où le nombre est comparé à votre réponse attendue. Puis retournez 1 ou 0 en fonction de votre résultat. – Crackerman

+0

aucune raison, je veux juste être en mesure d'avoir une demande qui vérifie si la table existe et renvoie 1 ou 0. Mais pouvez-vous donner plus de détails je n'ai pas vraiment compris ce que vous vouliez dire. –

Répondre

0

Vous pouvez créer une fonction qui renvoie 0 ou 1 en fonction d'une condition. Par exemple (je n'ai pas accès à une base de données Postgres pour vérifier la syntaxe!):

CREATE OR REPLACE FUNCTION checkTables() 
RETURNS smallint AS 
$BODY$ 
DECLARE 
cnt smallint; 
rntVal smallint; 
begin 
    SELECT count(1) 
    INTO cnt 
    FROM information_schema.tables tbl 
    where tbl.table_name IN ('graphe', 
          'proprieteindicateur', 
          'graphe_proprieteindicateur', 
          'utilisateurs', 
          'profil', 
          'droit'); 

    if(cnt == 6)then 
    rtnVal = 1 
    else 
    rtnVal = 0 
    end if; 
end; 
return rtnVal; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
+0

Oh wouah, merci beaucoup! mais je ne peux pas l'obtenir pourquoi il dit: ERREUR: erreur de syntaxe à ou près de "ELSE" –

+0

peut être manquant un point-virgule après "rtnVal = 1"? Vous devrez jouer avec pour le faire fonctionner. Je n'ai pas de vérificateur de syntaxe. – Crackerman

+0

Haha d'accord, merci. Je n'arrive pas à réussir maintenant mais je vais le trouver. Merci beaucoup pour votre aide précieuse !! –

1

Cela peut être fait avec une seule instruction:

with table_list (name) as (
    values 
    ('graphe'), 
    ('proprieteindicateur'), 
    ('graphe_proprieteindicateur'), 
    ('utilisateurs'), 
    ('profil'), 
    ('droit') 
) 
select count(*) = (select count(*) from table_list) 
from information_schema.tables it 
    join table_list l on it.table_name = l.name 
and it.table_schema = 'public'; 

Il retournera true si toutes les tables se trouvent , et false sinon.

0

J'ai trouvé une autre solution qui fonctionne plutôt bien, mais elle est en shell.

PRESENCE_TABLE=$OK 
for table in $LISTE_TABLE 
do 
    TABLE_EXISTE=$(psql -t -w -f $FILE_SQL_VERIF_MDD --set nom=\'$table\' | tr -d " ") 
    if [ -z $TABLE_EXISTE ] 
    then 
     echo_log -e "La table $table n''existe pas en base." 
     PRESENCE_TABLE=$KO 
    fi 
done 


if [ $PRESENCE_TABLE -ne $OK ] 
then 
    echo_log -e "Il manque de(s) table(s) dans le modele de donnees, il faut relancer le script avec l'option ...." 
    fct_exit $KO 
fi 

Hope it helps