SQL-Daten über ein View ändern, löschen und hinzufügen

Symptom

SQL-View als Zwischenschicht

In der Regel greift man bei einem Microsoft SQL Server 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

Mehr Informationen zu unseren Softwarelösungen und Services finden Sie auf
www.max-it.de/Softwarelösungen

Links und Quellen

www.msdn.microsoft.com/de-de/library/ms180800.aspx www.dev.mysql.com/doc/refman/5.0/en/view-updatability.html

Kontakt

Wenn Sie Fragen oder Anmerkungen zu diesem Artikel haben, melden Sie sich bitte bei uns:
techcorner@max-it.de.

Über m.a.x. Informationstechnologie AG:
Als etabliertes Münchner Systemhaus zeichnen wir uns seit 1989 als verlässlicher IT-Partner mittelständischer und
großer Unternehmen aus. Unser Portfolio reicht von IT- Services über individuelle Softwareentwicklung bis hin zur ERP-Beratung.

Tags

SQL, Microsoft SQL Server, Datenbank, View, Edit, Ändern, Join, Basistabelle