it-swarm.com.de

PostgreSQL: Spalte aus der Ansicht löschen

Ich habe ein VIEW, für das ich versuche, ein Evolutionsskript zu erstellen, damit ich ihm eine Spalte hinzufügen kann. Dieser Teil funktioniert gut; Spalte gut hinzugefügt. Das Gegenteil funktioniert jedoch nicht. Das Entfernen der zuletzt hinzugefügten Spalte schlägt mit einer Meldung ERROR: cannot drop columns from view fehl. Das Problem ist, dass diese spezielle Ansicht viele Referenzen hat, sowohl von als auch bis, daher kann ich nicht einfach DROP CASCADE Das verdammte Ding!

Gibt es einen Grund, warum ich eine neu hinzugefügte Spalte nicht aus einem bestimmten VIEW entfernen kann? Was kann ich dann tun, um diese Aufgabe zu erfüllen?

(Hinweis: Die Umstände hier sind wie sie sind, aber ich kann in vielen anderen Fällen sehr gut eine ähnliche Situation sehen, auch bekannt als Löschen einer Spalte aus einer Ansicht.)

10
Yanick Rochon

PostgreSQL (true bis mindestens 9.4) unterstützt derzeit nicht das Entfernen einer Spalte mit CREATE OR REPLACE VIEW .

Die neue Abfrage muss dieselben Spalten generieren, die von der vorhandenen Ansichtsabfrage generiert wurden (dh dieselben Spaltennamen in derselben Reihenfolge und mit denselben Datentypen), kann jedoch zusätzliche Spalten am Ende der Liste hinzufügen.

Es gibt keinen fundamentalen Grund, warum die Unterstützung für das Löschen von Spalten nicht hinzugefügt werden konnte, aber noch hat niemand die für die Implementierung erforderliche Arbeit geleistet.

CREATE OR REPLACE VIEW Müsste rekursiv alle Abhängigkeiten scannen und sicherstellen, dass keine von ihnen auf die zu löschende Spalte verweist. Wenn sie SELECT * Verwenden würden, müsste die Spalte aus der Erweiterung von * In der Abhängigkeit entfernt und dann ihre Abhängigkeiten auch. Damit ist einiges an Arbeit verbunden, und in einigen Bereichen ist nicht klar, wie genau sich das Löschen der Spalte verhalten soll, insbesondere bei Interaktionen mit Dump und Reload. Daher wollte noch niemand das Feature genug, um es zu implementieren. Patches und/oder Sponsoring der Entwicklung sind willkommen.

Sie müssen die Ansicht und alles, was davon abhängt, löschen und dann neu erstellen und ihre Abhängigkeiten neu erstellen. (Dasselbe galt früher für Hinzufügen einer Spalte zu einer Ansicht; Unterstützung für das Hinzufügen von Spalten wurde in 8.4 eingeführt.).

Beachten Sie, dass im Allgemeinen keine Erwartung besteht, dass DDL reversibel ist. Das Konzept der "Devolutions" ist wirklich fehlerhaft. Wenn Sie beispielsweise eine Spalte löschen und dann erneut hinzufügen, sind die Daten immer noch nicht mehr vorhanden.

13
Craig Ringer