Ich frage mich, wie man die Definition einer materialisierten Ansicht in Postgres abfragt. Was ich als Referenz erhofft habe, ist sehr ähnlich dem, was Sie für eine reguläre Ansicht tun können:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
Das gibt Ihnen die folgenden Spalten:
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
Ist dies für materialisierte Ansichten möglich?
Aus meiner bisherigen Forschung geht hervor, dass materialisierte Ansichten bewusst vom information_schema ausgeschlossen sind, weil
Das Informationsschema kann nur Objekte anzeigen, die im SQL-Standard vorhanden sind.
( http://www.postgresql.org/message-id/[email protected] )
Da sie von information_schema völlig ausgeschlossen zu sein scheinen, bin ich mir nicht sicher, wie ich vorgehen soll, aber ich möchte zwei Dinge tun:
- Abfrage, ob eine bestimmte materialisierte Ansicht vorhanden ist. (Bisher habe ich nur versucht, eine Mattenansicht mit demselben Namen zu erstellen und zu prüfen, ob sie in die Luft geht.)
- Fragen Sie anschließend die Definition der materialisierten Ansicht ab (ähnlich wie in der
view_definition
Spalte "Ein"information_schema.views
).
postgresql
materialized-view
postgresql-9.4
information-schema
Sean the Bean
quelle
quelle
SELECT to_regclass('some_schema.some_mat_view')
- Wenn es gefunden wird, muss es sich jedoch nicht um ein MV handeln. Details: stackoverflow.com/questions/20582500/…Antworten:
Sieht aus wie 9.3 und höher, die Sie tun können:
Weitere Informationen finden Sie hier: /programming/29297296/postgres-see-query-used-to-create-materialized-view
quelle
Es stellte sich heraus, dass dies nicht so kompliziert war, wie ich dachte! (Mit nur wenig Wissen über pg_catalog ...)
Teil 1: Abfrage, ob eine materialisierte Ansicht vorhanden ist:
Schön und leicht.
Teil 2: Abfragen der Definition einer materialisierten Ansicht:
Um eine Abfrage für die Definition der Mat-Ansicht zu erstellen, musste ich zuerst die Definition der
information_schema.views
Ansicht nachschlagen, indem ich Folgendes ausführte:Dann habe ich die Abfrage kopiert und in geändert
c.relkind = 'v'::"char"
,c.relkind = 'm'::"char"
um Matte-Ansichten (anstelle von regulären Ansichten) zu erhalten. Die vollständige Abfrage finden Sie hier: http://pastebin.com/p60xwfesZu diesem Zeitpunkt können Sie es ziemlich einfach hinzufügen
AND c.relname = 'some_mat_view'
und ausführen, um die Definition von zu erhaltensome_mat_view
.Sie müssen dies jedoch das nächste Mal erneut tun, wenn Sie die Definition einer Mattenansicht nachschlagen möchten ...
Bonus: Erstellen Sie eine Ansicht, um dies zu vereinfachen
Ich habe mich dafür entschieden, eine neue Ansicht zu erstellen, um das Nachschlagen von Mattenansichtsdefinitionen in Zukunft zu vereinfachen. Ich habe im Grunde nur
CREATE VIEW materialized_views AS
den Anfang der oben verlinkten Abfrage hinzugefügt , um die neue Ansicht zu erstellen, und jetzt kann ich sie wie folgt abfragen:Viel besser!
Ich kann auch diese Ansicht leicht Abfrage , ob eine Ansicht durch eine Änderung materialisiert besteht
*
zucount(*) > 0
.Haftungsausschluss : Ich weiß nicht, dass die anderen Spalten in den Abfrageergebnissen völlig korrekt sind, da materialisierte Ansichten sich grundlegend von Standardansichten unterscheiden (ich denke, sie haben Recht). Aber das tut zumindest Abfrage der
table_schema
,table_name
undview_definition
richtig.quelle
Der Nachteil bei den anderen Antworten ist, dass Sie nur die SQL-Definition erhalten, während Sie in den meisten Fällen an den tatsächlichen Spalten interessiert sind und diese als Text bearbeiten können. Das Folgende ist meine Antwort von einer ähnlichen Frage , die Spaltennamen und Datentypen enthält:
Ich kann nicht sagen, dass ich das zugrunde liegende Datenmodell vollständig verstehe. Verwenden Sie daher die folgende Lösung mit einem Körnchen Salz:
Sie müssen sich ändern
'your_schema'
und'your_materialized_view'
.quelle