MySQL bietet, wie andere Datenbanksysteme, die Funktionalität von sog. Triggern. Unter einem Trigger versteht man das Auslösen einer eigenen Prozedur, vor oder nach einer bestimmten Datenbankaktivität.
Das kann extrem praktisch sein, wenn man den Datenbestand losgelöst von einer darüberliegenden Anwendung verändern möchte. In diesem Beispiel habe ich einen Produkt-Datensatz, der ein Erstellungsdatum hat. Ich möchte das jeder Produkt-Datensatz den Zeitstempel der letzten Änderung selbstständig mit einem Trigger aktualisiert.
Erstellen wir im ersten Schritt die Tabelle product
CREATE TABLE `product` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `user_id` INT(10) NULL DEFAULT NULL, `short_desc` VARCHAR(50) NULL DEFAULT NULL, `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `modified` TIMESTAMP NULL DEFAULT NULL, `deleted` TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=2; |
Damit wir die Funktion des Triggers besser testen können, fügen wir nun erstmal einen Testdatensatz in die Tabelle product ein:
Wie man nun sieht, ist die Spalte modified leer, besser gesagt sie hat den Zustand NULL
Nun erstellen wir mit einem Create Script den Trigger:
CREATE TRIGGER tr_modifiy_timestamp_product BEFORE UPDATE ON product FOR EACH ROW SET NEW.modified = NOW() |
Das Skript ist schnell erklärt: Der Trigger reagiert auf das Event Before Update, d.h die Trigger Prozedur wird ausgelöst bevor er tatsächlich verändert wird. Keine Angst, der Trigger wird im jedenfall erst ausgeführt, wenn die Aktualisierung durchgeführt werden kann. Man muss sich keinen Kopf darum machen, was passiert wenn das Update schiefgeht. Der Befehl For Each Row definiert, dass die Prozedur auf jeden aktualisierten Datensatz angewendet werden soll. In der nächsten Zeile kommt jetzt die tatsächliche Aktivität und zwar set new.modified = now(). New ist die Definition des „neuen“ Datensatzzustandes und modified bezieht sich auf die jeweilige Spalte der Tabelle product. Die Funktion Now() ist eine MySQL Funktion liefert einfach den aktuellen Timestamp in die Spalte.
Wenn man den Trigger erstellt hat, gehen wir her und editieren einfach den bereits erstellten Testdatensatz und ändern einfach mal den Namen des Produktes in der Spalte short_desc
Da die Anpassung des Datensatzes erst nach dem Update geschieht, muss man im SQL Editor nach der Änderung auf Aktualisieren drücken und man sieht das Ergebnis. Der Datensatz hat nun das aktuelle Datum der Änderung gesetzt bekommen.
Aus meiner Sicht ist das extrem praktisch, wenn man nicht alle datenbezogenen Operationen in seiner Anwendung schreiben möchte. Gerade wenn man auf der Suche nach Möglichkeiten ist seine Anwendung zu optimieren und ggf. zu beschleunigen, sollte man sich überlegen ob ein paar Funktionen in der Datenbank als Trigger nicht besser aufgehoben sind.