it-swarm.com.de

Fragen Sie die Definition einer materialisierten Ansicht in Postgres ab

Ich frage mich, wie ich die Definition einer materialisierten Ansicht in Postgres abfragen soll. Als Referenz ist das, was ich mir erhofft habe, sehr ähnlich zu 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 von information_schema ausgeschlossen werden, weil

Das Informationsschema kann nur Objekte anzeigen, die im SQL-Standard vorhanden sind.

( http://www.postgresql.org/message-id/[email protected] )

Da sie anscheinend vollständig von information_schema ausgeschlossen sind, bin ich mir nicht sicher, wie ich vorgehen soll, aber ich möchte zwei Dinge tun:

  1. Fragen Sie ab, 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 explodiert.)
  2. Fragen Sie dann die Definition der materialisierten Ansicht ab (ähnlich der view_definition Spalte auf information_schema.views).
21
Sean the Bean

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:

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';

Schön und leicht.

Teil 2: Fragen Sie die Definition einer materialisierten Ansicht ab:

Um eine Abfrage zu erstellen, um die Definition der Mattenansicht zu erhalten, musste ich zuerst die Definition der Ansicht information_schema.views Nachschlagen, indem ich Folgendes ausführte:

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

Dann habe ich die Abfrage kopiert und c.relkind = 'v'::"char" In c.relkind = 'm'::"char" Geändert, um matte Ansichten zu erhalten (anstelle von regulären Ansichten). Die vollständige Abfrage finden Sie hier: http://Pastebin.com/p60xwfes

Zu diesem Zeitpunkt können Sie ganz einfach AND c.relname = 'some_mat_view' Hinzufügen und ausführen, um die Definition von some_mat_view Zu erhalten.

Aber wenn Sie das nächste Mal die Definition einer Mattenansicht nachschlagen möchten, müssen Sie dies noch einmal wiederholen ...

Bonus: Erstellen Sie eine Ansicht, um dies zu vereinfachen

Ich habe mich für die Erstellung einer neuen Ansicht entschieden, um das Nachschlagen von Definitionen für Mattenansichten in Zukunft zu vereinfachen. Ich habe im Grunde nur CREATE VIEW materialized_views AS Am Anfang der oben verlinkten Abfrage hinzugefügt, um die neue Ansicht zu erstellen, und jetzt kann ich sie wie folgt abfragen:

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

Viel besser!

Ich kann diese Ansicht auch verwenden, um einfach abzufragen, ob eine materialisierte Ansicht vorhanden ist, indem ich * In count(*) > 0 ändere.

Haftungsausschluss : Ich weiß nicht, dass die anderen Spalten in den Abfrageergebnissen völlig korrekt sind, da sich materialisierte Ansichten grundlegend von Standardansichten unterscheiden (I think sie haben recht). Dies fragt jedoch zumindest die Werte table_schema, table_name Und view_definition Richtig ab.

13
Sean the Bean

Sieht aus wie 9.3 und höher können Sie tun:

select * from pg_matviews;
select * from pg_matviews where matviewname = 'view_name';

Weitere Informationen finden Sie hier: https://stackoverflow.com/questions/29297296/postgres-see-query-used-to-create-materialized-view

30
Dustin

Der Nachteil bei den anderen Antworten hier 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 ähnliche Frage , die Spaltennamen und Datentypen enthält:

Ich kann nicht sagen, dass ich das zugrunde liegende Datenmodell vollständig verstehe. Verwenden Sie daher meine folgende Lösung mit einem Körnchen Salz:

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

Du musst dich ändern 'your_schema'und 'your_materialized_view'.