Zum Inhalt
wannacode

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.

SQLDatenbank: Shop
  • AFTER UPDATE OF price ON products: nach jeder Änderung des Preises.
  • WHEN OLD.price <> NEW.price: nur, wenn der Preis wirklich anders ist.
  • OLD ist die Zeile vor der Änderung, NEW danach.
  • Zwischen BEGIN und END stehen 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.

SQLDatenbank: Shop

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.

SQLDatenbank: Shop

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

Teste dich

1. Was sind OLD und NEW in einem Trigger nach UPDATE?
2. Ein Trigger läuft …
3. Was ist ein Nachteil von Triggern?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·