Postgres'te gerçekleşen görünümün tanımını sorgula


21

Postgres'te gerçekleşen görünümün nasıl sorgulanacağını merak ediyorum. Referans olarak, yapmayı umduğum şey, normal bir görünüm için yapabileceklerinize çok benziyor:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

bu da size aşağıdaki sütunları verir:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

Bu, somutlaşmış görüşler için mümkün mü?

Şimdiye kadar yaptığım araştırmadan, somutlaştırılmış görüşlerin bilinçli olarak info_schema'dan hariç tutulduğu anlaşılıyor, çünkü

İnformation_schema yalnızca SQL standardında bulunan nesneleri gösterebilir.

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

Bilgi_semadan tamamen dışlanmış gibi göründükleri için, bunun nasıl yapılacağından emin değilim, ama yapmak istediğim iki yönlü:

  1. Belirli bir somutlaştırılmış görünüm olup olmadığını sorgulayın. (Şimdiye kadar bunu yapmanın tek yolu, aynı ada sahip bir mat görünüm oluşturmayı ve havaya uçup patlamayacağını görmek.)
  2. Ve sonra materyalize görünümün tanımını sorgulayın ( view_definitionüzerindeki sütuna benzer information_schema.views).


Varlığı test etmenin hızlı yoluyla ilgileneceksiniz: SELECT to_regclass('some_schema.some_mat_view')- bulunursa, bunun bir MV olması gerekmez. Ayrıntılar: stackoverflow.com/questions/20582500/…
Erwin Brandstetter

Yanıtlar:



13

Bu düşündüğüm kadar karmaşık değildi! (Biraz pg_catalog bilgisi ile ...)

Bölüm 1: Gerçekleştirilmiş bir görünüm olup olmadığını sorgulama:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

Güzel ve kolay.

2. Bölüm: Gerçekleştirilmiş bir görünümün tanımını sorgulayın:

Mat görünümünün tanımını almak için bir sorgu bulmak için, önce information_schema.viewsçalıştırarak görünümün tanımını aramak zorunda kaldım :

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

Sonra sorgu dışarı kopyalanıp değişti c.relkind = 'v'::"char"etmek c.relkind = 'm'::"char"(yerine normal görüş) mat görüşlerini almak için. Sorgunun tamamını burada görebilirsiniz: http://pastebin.com/p60xwfes

Bu noktada AND c.relname = 'some_mat_view', tanımını almak için kolayca ekleyebilir ve çalıştırabilirsiniz some_mat_view.

Ancak bir dahaki sefere mat görünümün tanımını aramak istediğinizde bunu tekrar tekrar yapmak zorunda kalacaksınız ...

Bonus: Bunu kolaylaştırmak için bir görünüm oluşturun

Gelecekte mat görünüm tanımlarını aramayı kolaylaştırmak için yeni bir görünüm oluşturmayı seçtim. Temelde CREATE VIEW materialized_views ASyeni görünüm oluşturmak için yukarıda bağlı sorgu başlangıcına ekledi ve şimdi böyle sorgulayabilirsiniz:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

Çok daha iyi!

Bir görünüm değiştirerek mevcut materialised olmadığını ben de kolayca sorguya bu görünümü kullanabilirsiniz *için count(*) > 0.

Feragatname : Gerçekleştirilen görünümler standart görünümlerden temelde farklı olduğundan sorgu sonuçlarındaki diğer sütunların tamamen doğru olduğunu bilmiyorum ( doğru olduklarını düşünüyorum ). Ama bu en azından sorgu mu table_schema, table_nameve view_definitiondoğru.


0

Buradaki diğer cevapların dezavantajı, SQL tanımını almanız, çoğu durumda gerçek sütunlarla ilgilenmeniz ve bunları metin olarak değiştirebilmenizdir. Sütun adlarını ve veri türlerini içeren benzer bir sorudan cevabım aşağıdadır :

Altta yatan veri modelini tam olarak anladığımı söyleyemem, bu yüzden aşağıdaki çözümümü bir tuz tanesi ile kullanın:

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

Sen değiştirmek zorunda 'your_schema've 'your_materialized_view'.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.