Frage von JamesOffice, 47

Wann ist ein View löschbar, änderbar, einfügbar?

Hallo zusammen! komplette Frage steht im Titel :) Danke im Voraus!

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von daCypher, 36

Wenn deine Benutzerrechte es erlauben, dass du Views löschen oder ändern darfst. Was meinst du mit einfügbar? Dass du den View in eine andere Abfrage einbauen kannst? Das geht immer wenn du Lesezugriff auf den View hast.

Kommentar von JamesOffice ,

Im Buch steht:
Deletable: In order for DB2 to delete a row from a view it
must be able to map the row specified in the view to one,
and only one, row in a base table.
Updatable: In order to update a column in a view, DB2
must not only be able to map the row specified in the view
to one row in a base table, it also must be able to map the
column to be updated to a column in a base table. Hence all
views that are updatable must by definition also be
deletable.
Insertable: In order for a row to be inserted into a view,
DB2 must be able to map the new row to a table and to
map all the columns specified to columns in that table. Thus
all views that are insertable are by definition updatable and
hence deletable.

Aber ich verstehe das nicht ganz, könnest du es mir bitte auf gut Deutsch erklären? oder so ein Bsl. nennen? Danke sehr!

Kommentar von daCypher ,

Achso, jetzt kapiere ich erst, was du meinst. Du meinst nicht, wann man den View an sich löschen, ändern oder einfügen kann, sondern wann man die Datensätze, die ein View anzeigt, mit einer DELETE, UPDATE oder INSERT INTO Abfrage verändern kann.

Erstmal grobe Übersetzung zu Löschbar:
Um einen Datensatz aus einem View zu löschen, muss die Datenbank in der Lage sein, den zu löschenden Datensatz aus dem View mit einem (und wirklich nur einem) Datensatz aus einer der Basistabellen zu mappen.

Ein View ist ja nichts anderes, als eine Auswahlabfrage. Also du kannst bestimmte Spalten aus verschiedenen Tabellen miteinander verbinden, zusammenzählen, filtern etc. und dir halt das Ergebnis davon anzeigen lassen. 

Beispiel: Du hast drei Tabellen, z.B. Kunde, Artikel und Bestellung, und baust dir daraus einen View, der dir alle Bestellungen eines Kunden mit irgendwelchen Artikelinformationen anzeigt. Jetzt klickst du da auf einen Datensatz und sagst der Datenbank, dass dieser Datensatz gelöscht werden soll. Die Datenbank muss jetzt natürlich wissen, aus welcher der drei Tabellen der Datensatz gelöscht werden soll. Wenn der Datensatz aus der Kunde-Tabelle gelöscht wird, ist der Kunde nicht mehr im System, also z.B. Anschrift, Bankverbindung etc. sind weg. Wenn der Datensatz aus der Artikel-Tabelle gelöscht wird, sind die Informationen zum Artikel nicht mehr da, wodurch niemand mehr den Artikel kaufen kann. Der Datensatz darf also nur aus der Bestellung-Tabelle gelöscht werden und es darf eben auch für jeden Datensatz im View nur ein Datensatz aus der Bestellung gelöscht werden. Wenn der View also eine Gruppierungsabfrage ist, geht es schon nicht mehr.

Ich kenn mich mit DB2 nicht aus, aber bei MSSQL-Server würde ich dafür einen INSTEAD OF DELETE Trigger bauen.

Jetzt zu Änderbar:
Um eine Spalte in einem View zu ändern, muss DB2 nicht nur in der Lage sein, den ausgewählten Datensatz in einer der Basistabellen zu finden, sondern es muss zusätzlich wissen, welche Spalte in der Basistabelle zu der Spalte im View gehört. Das heißt: Alle Views die Updatable sein sollen, müssen per Definition auch Löschbar sein.

Wenn wir als Beispiel jetzt wieder die Bestellübersicht nehmen, dann muss die Datenbank z.B. wissen, in welcher Tabelle eine Änderung gemacht werden soll, wenn du in irgendeinem Feld aus dem View eine Änderung machst. Es muss sogar so sein, dass du z.B. nicht einfach in die Artikelbezeichnung was anderes reinschreibst und diese Artikelbezeichnung dadurch in allen Bestellungen mit dem gleichen Artikel geändert sind. Die Datenbank muss also wieder wissen, dass die Änderungen nur in der Bestell-Tabelle geändert werden dürfen (z.B. dass man ändern kann, wie oft der Artikel bestellt werden soll oder dass man eine andere Artikelnummer einträgt, weil es verschiedene Varianten des Artikels gibt)

Im Normalfall ist es so, dass die Datenbank selber weiß, welches Feld geändert werden soll, wenn du im View was änderst, aber die meisten Datenbanken sperren eine Änderung, damit du eben wie im Beispiel nicht versehentlich die Artikelbezeichnung verändern kannst.

Und als letztes noch Einfügbar:
Damit ein Datensatz in einen View eingefügt werden kann, muss DB2 in der Lage sein, den neuen Datensatz mit einer Basistabelle zu verknüpfen und außerdem auch alle Spalten, die im neuen Datensatz definiert sind, mit den Spalten der Basistabelle zu verknüpfen. Also sind alle Views, die insertable sind per Definition auch updateable und dadurch auch deleteable.

Dazu kann ich nur sagen, dass es sehr unüblich ist, einen Datensatz in einen View einfügen zu wollen. Normalerweise fügt man einen Datensatz immer in der Basistabelle ein.

Kommentar von wotan38 ,

Bei meiner DB2 kann ich auch nichts löschen, wenn ich die Info dazu aus mehreren Tabellen beziehe. Ich kann also nicht alle Kunden löschen, die nichts gekauft haben. Dazu muss ich erst mittels subselect die zutreffenden Kunden ermitteln und dann übergeordnet löschen.

delete from kunde

where kunde.id in

(select kunde.id from rechnung, auftrag .....)

Dieser eigentlich einfache Sachverhalt findet sich dann auch beim Ändern und Einfügen und auch in Bezug auf die Views.

Die IBM-Leute verstehen es, einfache Dinge so kompliziert zu beschreiben, dass man sie kaum noch verstehen kann (und englisch obendrein).

Antwort
von Tschoo, 13

Hallo!

Eine View existiert nur im Zusammenhang einer Query.

Wenn du die Rechte hast, die zugehörenden Tabellen zu bearbeiten, kannst du diese einsetzten, wie du willst.

Gruß

Keine passende Antwort gefunden?

Fragen Sie die Community