Schnell und dreckig
In Postgres 9.4+ verwenden
SELECT to_regclass('foo');
Gibt NULL zurück, wenn der Bezeichner nicht im Suchpfad gefunden wird. Verwenden Sie
in Postgres 9.3 oder älter eine Besetzung, umregclass
:
SELECT 'foo'::regclass;
Dies löst eine Ausnahme aus , wenn das Objekt nicht gefunden wird!
Wenn 'foo'
gefunden wird, wird das oid
in seiner text
Darstellung zurückgegeben. Dies ist nur der Tabellenname, der gemäß dem aktuellen Suchpfad schemaqualifiziert und bei Bedarf in doppelte Anführungszeichen gesetzt ist.
Wenn das Objekt nicht gefunden wird, können Sie sicher sein, dass es nirgendwo im Suchpfad vorhanden ist - oder überhaupt nicht für einen schemaqualifizierten Namen ( schema.foo
).
Wenn es gefunden wird, gibt es zwei Mängel :
Die Suche enthält implizite Schemata des Suchpfads , nämlich pg_catalog
undpg_temp
. Möglicherweise möchten Sie jedoch temporäre und Systemtabellen für Ihren Zweck ausschließen. (?)
Eine Umwandlung regclass
für alle Objekte im Systemkatalog pg_class
: Indizes, Ansichten, Sequenzen usw. Nicht nur Tabellen. Sie scheinen ausschließlich nach einem normalen Tisch zu suchen. Wahrscheinlich haben Sie jedoch auch Probleme mit anderen gleichnamigen Objekten. Einzelheiten:
Langsam und sicher
Wir sind wieder bei Ihrer Anfrage, verwenden diese jedoch nicht current_setting('search_path')
, wodurch die nackte Einstellung zurückgegeben wird. Verwenden Sie die dedizierte Systeminformationsfunktion current_schemas()
. Pro Dokumentation:
current_schemas(boolean)
name[]
Namen von Schemas im Suchpfad, optional einschließlich impliziter Schemas
"$user"
im Suchpfad wird intelligent aufgelöst. Wenn kein Schema mit dem Namen von SESSION_USER
vorhanden ist, wird das Schema zunächst nicht zurückgegeben. Abhängig davon, was Sie genau möchten, können Sie auch implizite Schemata ( pg_catalog
und möglicherweise pg_temp
) zusätzlich ausgeben - aber ich gehe davon aus, dass Sie diese für den vorliegenden Fall nicht möchten. Verwenden Sie also:
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 , die alle außer der letztenDO
Anweisungdemonstriert.
SQL Fiddle (JDBC) hat Probleme mit DO
Anweisungen, die Abschlusszeichen enthalten.