Bu test etmek istediğinize bağlıdır aynen .
Bilgi şeması?
"Tablonun var olup olmadığını" bulmak için ( kim sorarsa sorsun), bilgi şemasını ( information_schema.tables
) sorgulamak yanlıştır , çünkü ( belgelere göre ):
Yalnızca mevcut kullanıcının erişime sahip olduğu bu tablolar ve görünümler gösterilir (sahip olarak veya bazı ayrıcalıklara sahip olarak).
@Kong tarafından sağlanan sorgu geri dönebilir FALSE
, ancak tablo hala var olabilir. Soruyu cevaplar:
Bir tablonun (veya görünümün) mevcut olup olmadığı ve mevcut kullanıcının buna erişimi olup olmadığı nasıl kontrol edilir?
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
);
Bilgi şeması, temel olarak büyük sürümlerde ve farklı RDBMS'de taşınabilir kalmak için kullanışlıdır. Ancak uygulama yavaştır, çünkü Postgres standarda uymak için sofistike görünümler kullanmak zorundadır ( information_schema.tables
oldukça basit bir örnektir). Ve bazı bilgiler (OID'ler gibi), aslında tüm bilgileri taşıyan sistem kataloglarındaki çeviride kaybolur .
Sistem katalogları
Sorunuz şuydu:
Bir masanın var olup olmadığı nasıl kontrol edilir?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
AND c.relkind = 'r'
);
Sistem kataloglarını pg_class
ve pg_namespace
doğrudan kullanın, bu da oldukça hızlıdır. Bununla birlikte, aşağıdaki belgelere görepg_class
:
Katalog pg_class
kataloglar tabloları ve sütunları olan veya bir tabloya aksi benzer başka her şeyi. Buna indeksler (ama ayrıca bakın pg_index
), diziler , görünümler , somutlaştırılmış görünümler , bileşik tipler ve TOAST tabloları dahildir ;
Bu belirli soru için sistem görünümünüpg_tables
de kullanabilirsiniz . Başlıca Postgres sürümlerinde biraz daha basit ve daha taşınabilir (bu temel sorgu için pek de endişe verici değildir):
SELECT EXISTS (
SELECT FROM pg_tables
WHERE schemaname = 'schema_name'
AND tablename = 'table_name'
);
Tanımlayıcıların yukarıda bahsedilen tüm nesneler arasında benzersiz olması gerekir . Sormak istersen:
Belirli bir şemadaki bir tablo veya benzer bir nesne için bir adın alındığı nasıl kontrol edilir?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
);
Alternatif: yayınlama regclass
SELECT 'schema_name.table_name'::regclass
Bu , (isteğe bağlı olarak şema nitelikli) tablo (veya bu adı kullanan başka bir nesne) yoksa bir istisna oluşturur .
Tablo adını şema olarak nitelendirmezseniz, bulunan ilk tablo için regclass
varsayılana search_path
çevirme ve OID'yi döndürür veya tablo listelenen şemaların hiçbirinde değilse bir istisna. Sistem şemalarının pg_catalog
ve pg_temp
(mevcut oturumun geçici nesneleri için şema) otomatik olarak search_path
.
Bunu kullanabilir ve bir işlevde olası bir istisnayı yakalayabilirsiniz. Misal:
Yukarıdaki gibi bir sorgu olası istisnaları önler ve bu nedenle biraz daha hızlıdır.
Şimdi çok daha basit:
SELECT to_regclass('schema_name.table_name');
Oyuncularla aynı, ama geri dönüyor ...
... isim bulunmazsa bir hata atmak yerine boş
[[ `psql dbname -tAc "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'ejabberd' AND table_name = 'users');"` = 't' ]]