Rapide et sale
Dans Postgres 9.4+, utilisez
SELECT to_regclass('foo');
Renvoie NULL si l'identifiant n'est pas trouvé dans le chemin de recherche.
Dans Postgres 9.3 ou version antérieure, utilisez un cast pourregclass
:
SELECT 'foo'::regclass;
Cela déclenche une exception , si l'objet n'est pas trouvé!
Si 'foo'
est trouvé, le oid
est retourné dans sa text
représentation. C'est juste le nom de la table, qualifié par le schéma en fonction du chemin de recherche actuel et placé entre guillemets si nécessaire.
Si l'objet n'est pas trouvé, vous pouvez être sûr qu'il n'existe nulle part dans le chemin de recherche - ou pas du tout pour un nom qualifié par le schéma ( schema.foo
).
S'il est trouvé, il y a deux lacunes :
La recherche inclut des schémas implicites du chemin de recherche , à savoir pg_catalog
etpg_temp
. Mais vous souhaiterez peut-être exclure les tables temporaires et système pour votre usage. (?)
Une distribution qui regclass
fonctionne pour tous les objets du catalogue système pg_class
: index, vues, séquences, etc. Pas seulement les tables. Vous semblez rechercher une table régulière exclusivement. Cependant, vous aurez probablement aussi des problèmes avec d'autres objets du même nom. Détails:
Lent et sûr
Nous revenons à votre requête, mais ne l'utilisez pas current_setting('search_path')
, ce qui renvoie le paramètre nu. Utilisez la fonction d'informations système dédiée current_schemas()
. Par documentation:
current_schemas(boolean)
name[]
noms des schémas dans le chemin de recherche, y compris éventuellement des schémas implicites
"$user"
dans le chemin de recherche est résolu intelligemment. Si aucun schéma portant le nom de SESSION_USER
n'existe, le schéma n'est pas renvoyé pour commencer. En outre, selon ce que vous voulez exactement, vous pouvez également générer des schémas implicites ( pg_catalog
et éventuellement pg_temp
) - mais je suppose que vous ne voulez pas ceux pour le cas présent, alors utilisez:
DO
$do$
BEGIN
IF EXISTS (
SELECT -- list can be empty
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = ANY(current_schemas(FALSE))
AND n.nspname NOT LIKE 'pg_%' -- exclude system schemas!
AND c.relname = 'foo'
AND c.relkind = 'r') -- you probably need this
THEN
RAISE 'This application depends on tables created by another application';
END IF;
END
$do$;
SQL Fiddle , démontrant tout sauf la dernièreDO
instruction.
SQL Fiddle (JDBC) a des problèmes avec les DO
instructions contenant des caractères de terminaison.