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 oid
dö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_catalog
ve 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_USER
yoksa, ş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_catalog
ve 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 , sonDO
ifadehariç her şeyi gösterir.
SQL Fiddle (JDBC), DO
sonlandırma karakterlerini içeren ifadelerde sorun yaşıyor .