Benutzer-Werkzeuge

Webseiten-Werkzeuge


db:mysql:trigger

Datenbank-Trigger in MySQL

Ein Datenbank-Trigger ist eine automatische Funktion, die in MySQL durch ein Ereignisse angestoßen werden kann. Der Vorteil ist, dass diese Funktionen bereits auf Datenbankebene automatisiert ausgeführt werden und der Entwickler sich die aufwändigere Programmierung im Programmcode sparen kann. Dadurch kann der Funktionsaufruf an keiner Stelle vergessen werden.

Ereignis Beschreibungstext Alias OLD Alias NEW
INSERT BEFORE Vor der Erstellung eines neuen Datensatzes - X
INSERT AFTER Nach der Erstellung eines neuen Datensatzes - X
UPDATE BEFORE Vor der Aktualisierung eines bestehenden Datensatzes X X
UPDATE AFTER Nach der Aktualisierung eines bestehenden Datensatzes X X
DELETE BEFORE Vor dem Löschen eines bestehenden Datensatzes X -
DELETE AFTER Nach dem Löschen eines bestehenden Datensatzes X -

Um innerhalb des Triggers auf die Werte des alten und neuen Datensatzes zugreifen zu können stehen (je nach Ereignis) die Aliase „OLD“ und „NEW“ zur Verfügung.


Beispiel 1: Automatisches Update vom Kontostand beim Einfügen eines neuen Buchungssatzes

Damit der Kontostand des Mitspielers nicht bei jedem Seitenaufruf neu berechnet werden muss kann dieser bei jeder Änderung automatisch aktualisiert werden. So muss beim späteren Select nur ein Datenbankfeld ausgelesen werden. Das bringt Geschwindigkeitsvorteile beim Seitenaufruf.

CREATE TRIGGER `UpdateKontostand` AFTER INSERT ON `Buchungen` 
FOR EACH ROW 
UPDATE Mitspieler
SET Kontostand = ( SELECT SUM(Betrag) FROM Buchungen WHERE Mitspieler = NEW.Mitspieler )
WHERE ID = NEW.Mitspieler 

Bei jedem Einfügen eines neuen Datensatzes in die Tabelle „Buchungen“ wird der das Feld „Kontostand“ in der Tabelle „Mitspieler“ automatisch aktualisiert. Das Schlüsselwort „NEW“ stellt in diesem Kontext den neu angelegten Datensatz in der Tabelle „Buchungen“ dar.


Beispiel 2: Automatischer Log-Eintrag bei Statusänderung eines Mitspielers

In diesem Beispiel wird der Trigger nur ausgeführt, wenn die Bedingung der IF-Anweisung (Status hat sich geändert) zutrifft.

CREATE TRIGGER CreateLogeintrag AFTER INSERT ON Mitspieler 
FOR EACH ROW 
  IF OLD.STATUS != NEW.STATUS THEN BEGIN
    INSERT INTO Log ( Ereignis, old_value, new_value, Mitspieler ) VALUES ( 'Statusänderung', OLD.STATUS, NEW.STATUS, NEW.ID );
END; END IF;

Wenn der Status vom vorherigen Datensatz (OLD) vom Status nach der Änderung (NEW) abweicht wird in der Tabelle „Log“ ein neuer Datensatz erzeugt

db/mysql/trigger.txt · Zuletzt geändert: 2018/11/17 21:46 (Externe Bearbeitung)