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

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, Microsoft SQL Server, Datenbank, View, Edit, Ändern, Join, Basistabelle