Ich habe einen Ort, VIEW
für den 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 ERROR: cannot drop columns from view
Nachricht fehl . Das Problem ist, dass diese spezielle Ansicht viele Referenzen hat, sowohl von als auch bis, daher kann ich nicht nur DROP CASCADE
das verdammte Ding!
Gibt es einen Grund, warum ich eine neu hinzugefügte Spalte nicht aus einer bestimmten entfernen kann VIEW
? 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.)
quelle
ALTER VIEW ... ADD COLUMN
. Sind Sie mitCREATE OR REPLACE VIEW
? Zeigen Sie bitte Ihren Code .CREATE OR REPLACE VIEW
mit demselben Def, außer einer zusätzlichen Spalte (da in einer ref'ed-Tabelle eine neue Spalte hinzugefügt wurde, muss die Ansicht diese enthalten). Die "Devolution" entfernt die Spalte aus der ref'ed-Tabelle, so dassVIEW
sie auch nicht mehr zurückgegeben werden muss.Antworten:
PostgreSQL (true bis mindestens 9.4) unterstützt derzeit das Entfernen einer Spalte mit nicht
CREATE OR REPLACE VIEW
.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 es verwenden würdenSELECT *
, müsste es die Spalte aus der Erweiterung von*
in der Abhängigkeit entfernen und dann auch ihre Abhängigkeiten scannen . 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 das Hinzufügen einer Spalte zu einer Ansicht; die 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.
quelle