SQL Server 2016: Triggers, Stored Procedures und Funktionen

DML -Trigger

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
DML-Trigger reagieren auf Änderungen an Daten über INSERT, DELETE oder UPDATE.
06:24

Transkript

Damit werden wir bei der am häufigsten verwendeten Varianten von Triggern, nämlich den DML-Triggern. DML-Trigger reagieren auf Änderungen an Daten und können auf Tabellen oder Schichten erstellt werden. DML-Trigger können auch INSERT, DELETE und UPDATE funktional ersetzen, das heißt, ich kann damit zum Beispiel so etwas wie ein virtuelles Löschen realisieren. Das bedeutet, wenn eine Zeile gelöscht wird, wird sie nicht wirklich gelöscht, sondern zum Beispiel in einer anderen Tabelle verschoben oder lediglich durch ein Feld als gelöscht markiert. DML-Trigger können auch für unterschiedliche Anlasse definiert werden, INSERT, DELETE und UPDATE, oder eine beliebige Kombination daraus und ich habe dann die Möglichkeit zu sagen FOR INSERT, DELETE oder UPDATE oder ich kann sagen AFTER INSERT, DELETE oder UPDATE und damit steuere ich ein bisschen die Reihenfolge von Triggern, in welche Reihenfolge Trigger aufgerufen werden, wenn es auf einer Tabelle oder einer Schicht mehrere gibt. Dann gibt es die Variante mit INSTEAD OF. Das ist halt die Möglichkeit funktional INSERT, DELETE oder UPDATE zu ersetzen. Ich habe, während ein Trigger läuft, die Möglichkeit rauszufinden, wie die Daten vor und nach Triggerausführung aussahen. Damit kann ich zum Beispiel sehen, wenn ich ein UPDATE-Statement habe, dass die alte Variante der Daten in der DELETE-Tabelle ist, während die neue Variante, das heißt, nachdem das UPDATE-Statement gelaufen ist, in der INSERTED-Tabelle. Das sind virtuelle Tabellen, die nur zur Laufzeit innerhalb des Triggers zur Verfügung stehen und die sonst außerhalb nicht sichtbar sind. Dann gibt es eine Reihe von Funktionen, COLUMN_UPDATED und UPDATE, die mir sagen, welche Spalten aktualisiert worden sind. Das heißt, zu mindestens welche Spalten in der UPDATE-Anweisung auch wirklich vorgekommen sind. Nicht, ob sich der Wert geändert hat, das muss ich selber versuchen rauszufinden. Dann werden Trigger in der Transaktion der auslösenden Anweisung ausgeführt. Das bedeutet, wenn ich ein INSERT in einer Tabelle mache, ein Trigger einlauft, wird er innerhalb der gleichen Transaktion mit ausgeführt unabhängig davon, ob ich eine explizite Transaktion mit BEGIN TRANSACTION begonnen habe, oder sich um eine implizite Transaktion durch das INSERT-Statement selber handelt. Ich habe deswegen die Möglichkeit innerhalb dieser Transaktion die Änderungen abzubrechen, indem ich einfach nur ROLL BACK zum Beispiel ausführe oder schlicht einen Fehler auslöse. Im beiden Fällen wird es dazu führen, dass der Trigger seine Änderung rückgängig macht und die entsprechende DML-Anweisung wirkungslos bleibt. Um zu demonstrieren, wie das in TSQL aussieht, lege ich zunächst einmal wieder eine Datenbank an. Um einen DML-Trigger zu definieren brauche ich ein Ziel, in dem Fall diese kleine Tabelle. Dann lege ich den Trigger an, indem ich sage CREATE TRIGGER, dann den Namen des Triggers, das Ziel es ist in dem Fall die Tabelle da oben, also ON [dbo] [Tickets], und dann kann ich sagen FOR und dann die DML-Aktionen, die mich interessieren. Ich habe die Kombination aus allen drei genommen, INSERT, DELETE und UPDATE und was der Trigger macht, er geht hin und schaut, in welchen virtuellen Tabellen INSERTED oder DELETED sich Zeilen befinden und kann deswegen daraus schließen, ob es sich um ein UPDATE, ein INSERT oder ein DELETE handelt. Das Ergebnis gibt er schlicht und ergreifend aus dann. Dann kann ich zum Beispiel anfangen Daten einzufügen. Sie sehen hier eine INSERT- Anweisung fügt sechs Zeilen ein. Das bedeutet gleichzeitig, dass nur ein einziges Mal der Trigger ausgelöst ist. Es gibt die Regel, eine DML-Anweisung, ein Trigger-Lauf. Das heisst nicht wie beispielsweise bei Oracle, wo die Möglichkeit existiert, dass man für jede einzelne Zeile einmal den Trigger auslöst. Nein, hier wird der Trigger einmal pro DML, spricht in dem Fall pro INSERT-Statement, ausgeführt. Das heißt, wenn ich das laufen lasse, dann kriege ich erstmal das Feedback, dass sechs Zeilen eingefügt wurden und das sich offensichtlich um ein INSERT handelt. Dann kann ich zum Beispiel zwei Zeilen aktualisieren. Und zwar setzte ich hier einfach die TraceID auf 11, das sind die ersten beiden Zeilen, die ich hier setze, von 22, 23 auf 11. Das erkennt der Trigger natürlich, dass es eine UPDATE war, und wenn ich das nochmal mache, dann habe ich wieder two rows affected. Das SQL-Server ist nicht so implementiert, dass er prüft, ob es tatsächlich eine Änderung an den Daten gibt, sondern allein die Tatsache, dass ich ein UPDATE-Statement fahre, dass ich auf diese Tabelle gehe und dass ich diesen Wert dieser Spalte auf irgendetwas setzte, reicht um einen Trigger auszulösen. Das heißt, im Trigger muss ich selber zwischen INSERTED und DELETED prüfen, ob es wirklich Änderungen gegeben hat. Dann kann ich ein DELETE machen das erkennt er natürlich auch. In dem Fall ist nämlich nur in DELETED was zu finden. Wenn ich mir jetzt angucke, wie die Daten aussehen, dann sollten das vier Zeilen sein. Das passt auch soweit. Mit ALTER TRIGGER kann ich einen Trigger modifizieren. Das heißt, wenn ich das laufen lasse, kann ich zum Beispiel nochmal so ein UPDATE initiieren hier oben und ich bekomme dann nur noch die drei Punkte zu sehen. Um einen Trigger zu löschen, benutze ich mit DROP TRIGGER. Damit es nicht zu einem Fehler führt, falls der Trigger nicht vorhanden ist, muss ich wieder die OBJECT_ID-Funktion bemühen. Der übergebe ich den Namen des Triggers und entsprechend TR als Typ. Wenn ich das laufen lasse, dann ist der Trigger an der Stelle weg. Das mache ich noch nicht, ich gucke nochmal kurz hier, in den Object Explorer, in die Datenbank, in die Tabelle rein und da sehen Sie zum Beispiel, dass auch hier der Trigger zu finden ist. Den kann ich auch, wenn ich möchte, modifizieren oder mir skripten lassen und ich lösche das Ganze, aktualisiere hier die Ansicht der Trigger und Sie sehen, der Trigger ist verschwunden.

SQL Server 2016: Triggers, Stored Procedures und Funktionen

Nutzen Sie in SQL Server Trigger, gespeicherte Prozeduren, Late Binding, Fehlerbehandlung sowie Scalar- und Tabellenwertfunktionen.

3 Std. 12 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:08.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!