Trigger
Kurz gesagt: Ein Trigger ist eine Reihe von Anweisungen, die die Datenbank bei INSERT, UPDATE oder DELETE auf einer Tabelle von selbst ausführt, zum Beispiel um Preisänderungen zu protokollieren oder den Bestand zu aktualisieren.
Problem
Wer hat den Preis geändert?
Ein Kunde beschwert sich, dass der Kaffee gestern weniger gekostet hat. Die Datenbank kennt nur den heutigen Preis. Wann wurde er geändert, und von welchem? Das lässt sich nicht herausfinden.
Du könntest jedes Programm, das Preise anfasst, auch in ein Protokoll schreiben lassen. Aber jemand wird es vergessen: ein Skript für eine Preiserhöhung, eine manuelle Korrektur, ein neues Programm in einem Jahr.
Die Idee
Ein Trigger
Ein Trigger ist eine Abfrage, die die Datenbank von selbst ausführt, wenn sich in einer Tabelle etwas ändert. Er wird einmal geschrieben und gilt für jeden, der in die Datenbank schreibt.
AFTER UPDATE OF price ON products: nach jeder Änderung des Preises.WHEN OLD.price <> NEW.price: nur, wenn der Preis wirklich anders ist.OLDist die Zeile vor der Änderung,NEWdanach.- Zwischen
BEGINundENDstehen die Abfragen des Triggers. Sie bedeuten hier keine Transaktion, sondern seinen Rumpf.
Beide Preisänderungen stehen im Protokoll, ohne dass das Programm davon weiß.
Sieh es dir an
Der Bestand von allein
Ein Trigger kann auch Daten pflegen: Jede neue Zeile in einer Bestellung verringert den Bestand des Produkts.
Die Äpfel waren 80, jetzt sind es 77. Der Trigger läuft in derselben Transaktion wie das INSERT. Wird die Bestellung zurückgerollt, wird auch der Bestand zurückgerollt.
Probier es aus
Eine Warnung bei einer schlechten Bewertung
Die Tabelle alerts (review_id, product_id) gibt es schon. Schreib einen Trigger, der bei einer neuen Bewertung mit rating 1 die Nummer der Bewertung und das Produkt in alerts einträgt. Die Prüfung fügt zwei Bewertungen mit 1 und 5 hinzu und sieht sich alerts an.
Lösung
CREATE TRIGGER bad_review
AFTER INSERT ON reviews
WHEN NEW.rating = 1
BEGIN
INSERT INTO alerts VALUES (NEW.id, NEW.product_id);
END;CREATE TRIGGER bad_reviewAFTER INSERT ON reviewsWHEN NEW.rating = 1BEGIN INSERT INTO alerts VALUES (NEW.id, NEW.product_id);END;Nur die Bewertung mit 1 kommt in alerts.
Die Idee
Wann ja, wann nein
Trigger eignen sich für Dinge, die immer passieren müssen, egal welches Programm schreibt: ein Protokoll der Änderungen, eine berechnete Spalte aktuell halten, eine Prüfung, die CHECK nicht kann.
Ihr Preis: Die Logik ist versteckt. Wer den Code des Programms liest, sieht ein INSERT, und die Datenbank tut drei Dinge mehr. Ein Trigger, der einen Trigger auslöst, der einen Trigger auslöst, ist schwer zu debuggen. Geschäftsregeln wie Rabatte und Angebote sind im Code des Programms meist klarer.
Genauer, für Neugierige
In PostgreSQL ist der Rumpf eines Triggers eine eigene Funktion (CREATE FUNCTION … RETURNS trigger, dann CREATE TRIGGER … EXECUTE FUNCTION). Es gibt auch BEFORE-Trigger, die NEW ändern können, bevor die Zeile hineinkommt. SQLite hat sowohl BEFORE als auch INSTEAD OF für Views.
Test