Szybko i brudno
W PostgreSQL 9.4+ użytku
SELECT to_regclass('foo');
Zwraca NULL, jeśli identyfikator nie został znaleziony w ścieżce wyszukiwania.
W Postgresie 9.3 lub starszym użyj obsady, abyregclass
:
SELECT 'foo'::regclass;
To podnosi wyjątek , jeśli obiekt nie został znaleziony!
Jeśli 'foo'
zostanie znaleziony, oid
zostanie zwrócony w swojej text
reprezentacji. To tylko nazwa tabeli, kwalifikowana do schematu zgodnie z bieżącą ścieżką wyszukiwania i w razie potrzeby podwójnie cytowana.
Jeśli obiekt nie zostanie znaleziony, możesz być pewien, że nie istnieje on nigdzie na ścieżce wyszukiwania - lub wcale nie ma nazwy kwalifikowanej do schematu ( schema.foo
).
Jeśli zostanie znaleziony, występują dwie wady :
Wyszukiwanie obejmuje niejawne schematy ścieżki szukania , a mianowicie pg_catalog
ipg_temp
. Ale możesz chcieć wykluczyć tabele temp i systemowe do swoich celów. (?)
Rzutowanie regclass
działa na wszystkie obiekty w katalogu systemowym pg_class
: indeksy, widoki, sekwencje itp. Nie tylko tabele. Wygląda na to, że szukasz wyłącznie zwykłego stołu. Prawdopodobnie będziesz mieć również problemy z innymi obiektami o tej samej nazwie. Detale:
Powolny i pewny
Wróciliśmy do Twojego zapytania, ale nie używaj go current_setting('search_path')
, co powoduje powrót do samego ustawienia. Użyj dedykowanej funkcji informacji o systemie current_schemas()
. Według dokumentacji:
current_schemas(boolean)
name[]
nazwy schematów w ścieżce wyszukiwania, opcjonalnie włączając schematy niejawne
"$user"
w ścieżce wyszukiwania jest rozwiązany elegancko. Jeśli nie SESSION_USER
istnieje żaden schemat o nazwie istnieje, schemat nie jest zwracany na początek. Ponadto, w zależności od tego, czego dokładnie chcesz, możesz dodatkowo generować schematy niejawne ( pg_catalog
i być może pg_temp
) - ale zakładam, że nie chcesz ich dla danej sprawy, więc użyj:
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 , pokazujący wszystko oprócz ostatniejDO
instrukcji.
SQL Fiddle (JDBC) ma problemy z DO
instrukcjami zawierającymi znaki zakończenia.