INSTEAD OF UPDATE-Trigger

Mithilfe von INSTEAD OF UPDATE-Triggern für eine Sicht oder eine Tabelle können die Standardaktionen der UPDATE-Anweisung ersetzt werden. Normalerweise wird der INSTEAD OF UPDATE-Trigger für eine Sicht definiert, um Daten in mindestens einer Basistabelle zu ändern.

UPDATE-Anweisungen, die auf Sichten mit INSTEAD OF UPDATE-Triggern verweisen, müssen Werte für alle Sichtspalten angeben, die keine NULL-Werte zulassen und auf die in der SET-Klausel verwiesen wird. Dazu zählen Sichtspalten, die auf Spalten in der Basistabelle verweisen, für die keine Eingabewerte angegeben werden können, wie z. B.:

  • Berechnete Spalten in der Basistabelle.

  • Identitätsspalten in der Basistabelle, für die IDENTITY INSERT auf OFF festgelegt ist.

  • Basistabellenspalten vom timestamp-Datentyp.

Wenn eine UPDATE-Anweisung, die auf eine Tabelle verweist, versucht, den Wert einer berechneten Spalte, einer Identitätsspalte oder einer timestamp-Spalte festzulegen, wird normalerweise ein Fehler generiert, da die Werte für diese Spalten von SQL Server bestimmt werden müssen. Diese Spalten müssen in die UPDATE-Anweisung eingeschlossen werden, um die NOT NULL-Anforderung der Spalte zu erfüllen. Wenn die UPDATE-Anweisung jedoch auf eine Sicht mit einem INSTEAD OF UPDATE-Trigger verweist, kann die im Trigger definierte Logik diese Spalten umgehen und den Fehler vermeiden. Hierzu darf der INSTEAD OF UPDATE-Trigger nicht versuchen, die Werte für die entsprechenden Spalten in der Basistabelle zu aktualisieren. Dies erreichen Sie, indem die Spalten in der SET-Klausel der UPDATE-Anweisung ausgeschlossen werden. Wenn ein Datensatz aus der inserted-Tabelle verarbeitet wird, kann die berechnete Spalte, die Identitätsspalte oder die timestamp-Spalte einen Dummywert enthalten, um die NOT NULL-Anforderung zu erfüllen; diese Werte werden jedoch von dem INSTEAD OF UPDATE-Trigger ignoriert, und stattdessen werden die ordnungsgemäßen Werte von SQL Server festgelegt.

Diese Lösung funktioniert, weil ein INSTEAD OF UPDATE-Trigger keine Daten aus den Spalten der inserted-Tabelle verarbeiten muss, die nicht aktualisiert wurden. In der an einen INSTEAD OF UPDATE-Trigger übergebenen inserted-Tabelle gelten für die Spalten, die in der SET-Klausel angegeben sind, dieselben Regeln wie für die inserted-Spalten in einem INSTEAD OF INSERT-Trigger. Für Spalten, die in der SET-Klausel nicht angegeben sind, enthält die inserted-Tabelle dieselben Werte wie vor dem Ausstellen der UPDATE-Anweisung. Mit der IF UPDATE(column)-Klausel kann der Trigger testen, ob eine bestimmte Spalte aktualisiert wurde. Weitere Informationen finden Sie unter INSTEAD OF INSERT-Trigger.

INSTEAD OF UPDATE-Trigger sollten Werte, die für berechnete, Identitätsspalten oder timestamp-Spalten angegeben werden, nur in Suchbedingungen der WHERE-Klausel verwenden.

Ein INSTEAD OF UPDATE-Trigger für eine Sicht sollte zum Verarbeiten aktualisierter Werte für berechnete Spalten, Identitätsspalten, timestamp- oder Standardspalten dieselbe Logik wie bei eingefügten Werten für diese Spaltentypen verwenden.

HinweisHinweis

INSTEAD OF UPDATE-Trigger können nicht für eine Tabelle definiert werden, für die ein Fremdschlüssel mit einer UPDATE-Aktion definiert wurde.