Advanced MySQL - Zwischenspeicherung - Trigger
1. Einführung
Bei einem Trigger handelt es sich um eine Sammlung von SQL-Anweisungen, die man auf eine Tabelle anwendet. Dieser Trigger wird
dann automatisch bei einem bestimmten Event ausgelöst. Dabei kann es um INSERT
-, UPDATE
- oder
DELETE
-Anweisungen handeln. Das unterscheidet ihn von Routinen, die explizit aufgerufen werden müssen.
Vorteile
- Man kann hiermit für eine saubere referentielle Integrität sorgen.
- Man kann logische Fehler in einer Anwendung auf Datenbankebene abfangen.
- Man kann damit sehr gut Änderungen an einer Datenbank protokollieren.
Nachteile
- Es ist keine vollständige Validierung von Daten möglich.
- Trigger werden im Hintergrund ausgeführt und sind somit unsichtbar für den Client. Das erschwert die Fehlersuche ungemein.
- Sie werden jedes Mal ausgeführt, wenn sich eine entsprechende Tabelle ändert. Und das kann MySQL verlangsamen.
2. Einschränkungen
Bei Triggern sind einige Dinge verboten und führen zu einer Fehlermeldung. Ich zähle hier nur die Wichtigsten auf.
- Es dürfen keine Routinen aufgerufen werden.
- Es dürfen keine Trigger für Views oder temporärere Tabellen angelegt werden.
- Es dürfen keine Transaktionen ausgeführt werden.
3. Aufbau
Ein Trigger hat eine ähnliche Struktur wie eine Routine oder ein View. Man muss also auch hier mit dem schon allseits bekannten
DELIMITER
arbeiten.
DELIMITER |
CREATE TRIGGER name zeitpunkt event ON tabellen_name
FOR EACH ROW BEGIN
...
END|
DELIMITER ;
zeitpunkt
Hier gibt es zwei Möglichkeiten, BEFORE
und AFTER
. Beide beziehen sich auf das Event der Tabelle.
Ein CREATE TRIGGER blubb BEFORE UPDATE ON blubber
wird also vor dem Event der Tabelle ausgeführt.
4. Übernahme von Werten
Will man zum Beispiel geänderte Werte in einer anderen Tabellen mitloggen, so gibt es mehrere Möglichkeiten. Grundsätzlich
wird unterschieden zwischen OLD
(alter Wert) und NEW
(neuer Wert). Wegen der Logik von UPDATE
-
und DELETE
-Anweisungen gibt es natürlich ein paar Einschränkungen.
-
BEFORE/AFTER UPDATE
- Alte Werte mit
OLD
verfügbar. - Neue Werte mit
NEW
verfügbar.
- Alte Werte mit
-
BEFORE/AFTER DELETE
- Alte Werte mit
OLD
verfügbar.
- Alte Werte mit
-
BEFORE/AFTER INSERT
- Neue Werte mit
NEW
verfügbar.
- Neue Werte mit
Schaut mal das entsprechende SQL-Beispiel an, da habe ich damit gearbeitet.