SQL-Daten über ein View ändern, löschen und hinzufügen
Inhaltsverzeichnis
Symtom
SQL-View als Zwischenschicht
In der Regel greift man direkt auf eine SQL-Tabelle zu, um Daten zu ändern, hinzuzufügen oder zu löschen. Manchmal ist aber der Zugriff direkt auf die Tabelle nicht erwünscht, sondern es steht eine SQL-View dazwischen, die die Daten aufbereitet. Nun fragen Sie sich: ist es möglich, die Daten über diese SQL-View nicht nur abzufragen, sondern auch zu modifizieren? Die Antwort ist JA.
Ursache und Lösung
Ein mögliches Szenario, wozu man das brauchen könnte:
Sie haben eine historisch gewachsene Datenbank, die Sie gerne umbauen möchten: einige nicht mehr benötigte Spalten löschen, neue Spalten erstellen und sogar die Datentypen einiger Spalten ändern. Sie wollen, dass Ihre neuen Applikationen saubere Daten zur Verfügung haben. Schön! Aber auf diese Datenbank greifen alte Applikationen zu, die Sie nicht anpassen wollen bzw. dürfen. Und da kann es nun hilfreich sein, für die alten Applikationen so eine Art Zwischenschichten, also SQL-Views bereitzustellen. Dann bekommen die alten Applikationen Ihren Umbau nicht mit und Sie können mit ruhigem Gewissen Ihre Datenbank neu verkleiden.
Ein anderes Szenario: Sie wollen sicherstellen, dass die Applikation nur mit einer gefilterten Menge der Daten arbeitet und nie den Rest der Daten anfasst. Dann erzeugen Sie eine View mit Where-Klausel und mit Check Option. Nun steht der Applikation nur eine Schnittmenge der Daten zur Verfügung.
SQL-View erzeugen
Erzeugen Sie eine SQL-View mit den benötigten Spalten. Es können dabei Where und Join benutzt werden, falls notwendig. WITH CHECK OPTION bewirkt dabei, dass die Einschränkungen, die in der Where-Klausel vorkommen, bei der Änderung der Daten streng geprüft werden.
CREATE VIEW Kunden AS SELECT bewegdaten.Id, bewegdaten.Name, bewegdaten.Vorname, stammdaten.OrtName as Ort FROM Kunden_Archiv bewegdaten JOIN Orte stammdaten ON bewegdaten.OrtId = stammdaten.Id WHERE Land='DE' WITH CHECK OPTION
SELECT aus View
SELECT * FROM Kunden ORDER BY Id
Es kommt ganz normal ein Resultset zurück.
UPDATE über View
Wenn das UPDATE-Commando nur die Daten in der Basis-Tabelle ändert (es also keine Tabellen anfasst, die an Join geknüpft sind), dann ist es überhaupt kein Problem:
UPDATE Kunden SET Name='Müller' WHERE ID = 123
Falls die Änderung tiefer geht und mehrere Tabellen betrifft, dann brauchen Sie einen Trigger. Z.B.:
CREATE TRIGGER TRG_Update_Kunden ON Kunden INSTEAD OF UPDATE AS BEGIN SET NOCOUNT ON; UPDATE Kunden_Archiv SET Name = inserted.Name, Vorname = inserted.Vorname, OrtId = stammdaten.Id, FROM inserted LEFT OUTER JOIN Orte stammdaten ON inserted.Ort = stammdaten.OrtName WHERE Kunden_Archiv.ID = inserted.ID - - ggf. Weitere Schritte, z.B. Insert in Historie-Tabelle END
DELETE über View
Falls das View mehrere Tabellen verknüpft (JOIN), dann ist das Löschen nur mithilfe eines Triggers möglich.
Ansonsten bekommt man die Fehlermeldung:
„Meldung 4405, Ebene 16, Status 1, Zeile 11“ „Die Sicht oder Funktion 'Kundendaten' kann nicht aktualisiert werden, da die Änderung sich auf mehrere Basistabellen auswirkt.“
Lösung: InsteadOff-Trigger:
CREATE TRIGGER TRG_Delete_Kunden ON Kunden INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON; -- Delete in Basistabelle DELETE Kunden_Archive FROM deleted WHERE Kunden_Archiv.ID = deleted.ID; -- ggf. Weitere Schritte, z.B. Insert in Historie END GO
INSERT über View
Hier gibt desselbe: falls die View mehrere Tabellen verknüpft, dann benutzen Sie für das Hinzufügen der Daten einen „Instead Off Insert" - Trigger.
Weitere Informationen
https://mittelstand.max-it.de/Individualloesungen
Links und Quellen
http://msdn.microsoft.com/de-de/library/ms180800.aspx
http://dev.mysql.com/doc/refman/5.0/en/view-updatability.html
Kontakt
Wenn Sie Fragen oder Anmerkungen zu diesem Artikel haben, wenden Sie sich bitte gerne an mailto:techcorner@max-it.de.
Tags
SQL, Datenbank, View, Edit, Ändern, Join, Basistabelle