Hızlı ve kirli
Postgres 9.4+ kullanımı
SELECT to_regclass('foo');
Tanımlayıcı arama yolunda bulunmazsa NULL değerini döndürür.
Postgres 9.3 veya daha eski sürümlerde şunlar için oyuncu kadrosu kullanınregclass :
SELECT 'foo'::regclass;
Bu bir özel durum nesnesi bulunmazsa,!
Eğer 'foo'bulunursa, temsilinde oiddöndürülür text. Bu sadece tablo adı, geçerli arama yoluna göre şema nitelemeli ve gerektiğinde çift tırnaklı.
Nesne bulunmazsa, arama yolunun herhangi bir yerinde bulunmadığından emin olabilirsiniz - ya da şema nitelemeli bir ad için hiç yoktur ( schema.foo).
Eğer bulunursa iki eksiklik vardır :
Arama, arama_yolunun örtülü şemalarını , yani pg_catalogve içerirpg_temp . Ancak temp ve sistem tablolarını amacınız için hariç tutmak isteyebilirsiniz. (?)
Döküm regclass, sistem kataloğundaki tüm nesneler için çalışır pg_class: dizinler, görünümler, diziler vb . Sadece tablolar değil. Sadece düzenli bir masa arıyor gibi görünüyor. Ancak, muhtemelen aynı addaki diğer nesnelerle de sorun yaşayacaksınız. Detaylar:
Yavaş ve emin
Sorgunuza geri döndük, ancak current_setting('search_path')çıplak ayarı döndüren kullanmıyoruz . Özel sistem bilgi işlevini kullanın current_schemas(). Belgelere göre:
current_schemas(boolean) name[]
arama yolundaki şemaların adları, isteğe bağlı olarak örtük şemalar dahil
"$user"arama yolunda akıllıca çözülür. Eğer adında bir şema SESSION_USERyoksa, şema başlamak için döndürülmez. Ayrıca, tam olarak ne istediğinize bağlı olarak, ek olarak örtük şemalar ( pg_catalogve muhtemelen pg_temp) çıktısı alabilirsiniz - ancak eldeki durum için bunları istemediğinizi varsayalım, bu yüzden kullanın:
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 , sonDOifadehariç her şeyi gösterir.
SQL Fiddle (JDBC), DOsonlandırma karakterlerini içeren ifadelerde sorun yaşıyor .