====== 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