Une base de données Postgres, de nombreux schémas dont la structure est calquée les uns sur les autres mais qui ne contiennent pas nécessairement les mêmes tables. C'est dans ce contexte que j'ai eu à écrire un script qui devait parcourir chaque schéma afin de vérifier la présence d'une table précise et si c'était le cas, appliquer une modification à la structure afin que les tables soient uniformes à travers les différents schémas.
Comment peut-on vérifier l'existance d'une table dans un schéma ? Si on fait un SELECT sur une table inexistante, peut-on capturer une exception plutôt que de provoquer une erreur ? Est-ce qu'il existe une fonction système pour en faire la vérification ? Je n'en ai pas trouvé. Par contre, en cherchant un peu dans les catalogues systèmes, j'ai pu écrire une requête SQL qui permet de vérifier la présence d'une table dans un schéma spécifié (autrement, il cherchera dans le schéma public par défaut) :
SELECT *Si la requête retourne un enregistrement, c'est qu'une table a été trouvée (à utiliser avec EXISTS ou FOUND). Pour le reste, il suffit de l'encapsuler dans une fonction à réutiliser dans vos différents projets :
FROM pg_class as tbl
INNER JOIN pg_namespace as schm on tbl.relnamespace = schm.oid
WHERE schm.nspname = '' || p_s_schema || ''
AND tbl.relname = '' || p_s_tablename || ''
CREATE OR REPLACE FUNCTION table_exists(schema_name character varying, table_name character varying)Appel à la fonction :
RETURNS boolean AS
$BODY$
BEGIN
IF EXISTS(
SELECT *
FROM pg_class as tbl
INNER JOIN pg_namespace as schm on tbl.relnamespace = schm.oid
WHERE schm.nspname = '' || schema_name || ''
AND tbl.relname = '' || table_name || ''
) THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
SELECT table_exists('public', 'employees') // retourne true ou false
Bonjour !!
plus simplement :
SELECT table_name FROM information_schema.tables WHERE table_schema='nom_schema' AND table_name='nom_table'
même chose pour l'existance d'un schema :
SELECT table_schema FROM information_schema.tables WHERE table_schema='nom_schema' GROUP BY table_schema
ou une colonne :
SELECT column_name FROM information_schema.columns WHERE table_schema='nom_schema' AND table_name='nom_table' AND column_name='nom_colonne'