Trigger
Mit einem Trigger können vor/nach Datenänderungen an einer bestimmten Tabelle benutzerdefinierte Aktionen ausgeführt werden.
Limbas unterstützt dabei zwei Typen: Datenbank-Trigger und Limbas-Trigger.
Verwaltung
Trigger können unter Admin → Tools → Trigger verwaltet werden.
Um einen Trigger hinzuzufügen, muss ein (eindeutiger) Name, die gewünschte Tabelle, sowie der Typ (BEFORE/AFTER INSERT/UPDATE/DELETE) des Triggers angegeben werden. Danach können über das Stift-Symbol der Spalte Definition die auszuführenden Aktionen des Triggers angepasst werden.
Datenbanktrigger
Ein Datenbanktrigger führt nach entsprechendem Anstoß eine Datenbankprozedur aus. Dabei muss beachtet werden, dass pro Tabelle jeder Typ (BEFORE/AFTER INSERT/UPDATE/DELETE) in der Datenbank nur einmal definiert werden kann.
Trigger werden grundsätzlich in der Systemtabelle lmb_trigger gespeichert und in einem zweiten Schritt mit den eigentlichen Datenbanktriggern synchronisiert.
Bei „speichern“ werden neue/veränderte Eingaben in die LIMBAS-Systemtabelle „lmb_trigger“ eingetragen, die Aktionen werden ggf. zu Prozeduren zusammengefasst und dann als Trigger in der Datenbank angelegt.
Bei „synchronisieren“ wird überprüft, ob in den Prozeduren der Datenbank-Trigger Aktionen definiert sind, die in der Systemtabelle „lmb_trigger“ nicht vorhanden sind. Diese werden versucht in die Tabelle „lmb_trigger“ hinzuzufügen, bevor der Vorgang dann wie bei „speichern“ weiter abläuft.
Beim Einfügen von Verknüpfungen in eine Tabelle, legt LIMBAS automatisch Datenbanktrigger an, die die Einträge in der zugehörigen Verknüpfungstabelle vornehmen. Verknüpfungen. Diese Systemtrigger können durch die Option „show limbas trigger“ ein/ausgeblendet werden.
Limbas-Trigger
Im Gegensatz zu Datenbanktriggern, kann mit Limbas-Triggern eigener PHP-Code ausgeführt werden. Es empfiehlt sich, diesen in eine Funktion einer Erweiterung auszulagern. Es steht dabei der gewohnte Limbas-Funktionsumfang zur Verfügung. Trigger werden sogar bei Änderungen an Sonderfeldern wie Verknüpfungen oder Mehrfach-Auswahlfeldern ausgeführt. Pro Tabelle können mehrere Trigger mit gleichem Typ definiert werden. Diese werden bei einer Datenbankänderung in der aufgelisteten Reihenfolge ausgeführt.
Nach dem Anlegen eines Limbas-Triggers und einem reset, kann unter Admin → Tabellen in der Spalte Trigger der neu erstellte Trigger einer Tabelle zugewiesen werden. Wahlweise kann dieser in den Tabellenfeld-Einstellungen auch nur bestimmten Feldern oder in den Tabellenrechten nur bestimmten Gruppen zugewiesen werden. Erst nach Zuweisung ist der Trigger aktiv!
Bei Ausführung eines Triggers sind folgende PHP-Variablen verfügbar und können an die eigene Funktion in beliebiger Reihenfolge übergeben werden. Einige Variablen sind nicht für alle Triggertypen verfügbar:
Variable | Beschreibung | gültig für |
---|---|---|
$typ | INSERT/UPDATE/DELETE | alle |
$position | BEFORE/AFTER | alle |
$gtabid | Tabellen-ID | alle |
$fieldid | Feld-ID | alle aus Feldern aufgerufene Trigger |
$trigger | Definition des Triggers | alle |
$ID | Datensatz-ID | alle |
$new_value | Neuer Wert – als Wert oder Array | BEFORE/AFTER UPDATE |
$old_value | Alter Wert – als Array | BEFORE/AFTER UPDATE |
Bei BEFORE kann durch ein return false ein Rollback initiiert werden. Änderungen werden dann nicht übernommen.
Beispiele
after insert
Modifikation eines neuen Datensatzes. Das Feld DATE soll den aktuellen Zeitstempel beinhalten.
function myExt_updateBill($ID) {
global $db;
$query = 'UPDATE BILLING SET DATE = TIMESTAMP WHERE ID = ' . $ID;
$rs = odbc_exec($db, $query);
}
der Trigger würde lauten:
myExt_updateBill($ID);
before delete
Prüfen ob eine Rechnung gelöscht werden darf. Ein return false bricht die Löschfunktion vor ihrer Ausführung ab.
function myExt_checkBill($ID, $gtabid) {
global $db;
$query = 'SELECT ID,RESERVED FROM BILLING WHERE ID = ' . $ID;
$rs = odbc_exec($db, $query);
if(odbc_result($rs, 'RESERVED')){
lmb_alert('deleting reserved billings is not allowed!');
return false;
}
return true;
}
der Trigger würde lauten:
return myExt_checkBill($ID, $gtabid);
after update
In einer Tabelle Positionen existieren unter anderem die Felder Preis, Anzahl und Summe. Es soll bei Änderung der Felder Preis oder Anzahl das Feld Summe neu berechnet werden. Dazu erstellen wir einen Limbas Trigger „my_calculate_sum($ID)“ mit einem beliebigen Namen, für die Tabelle Positionen, mit dem Attribut „after update“ und wählen Ihn in den Feldern Preis und Anzahl der Tabelleneinstellungen aus.
function my_calculate_sum($ID) {
global $db;
$sqlquery = 'UPDATE POSITIONEN SET SUMME = (PREIS * ANZAHL) WHERE ID = ' . $ID;
$rs = odbc_exec($db, $sqlquery);
}
der Trigger würde lauten:
my_calculate_sum($ID);
after update
Die Gleiche Funktion können wir für das Feld Anzahl mit den Variablen $new_value und $old_value beschreiben.
function my_calculate_sum2($ID, $gtabid, $new_value, $old_value) {
global $db;
$sum = ($old_value[$gtabid][PREIS_FIELD_ID][0] * $new_value);
$sqlquery = 'UPDATE POSITIONEN SET SUMME = ' . parse_db_float($sum) . ' WHERE ID = ' . $ID;
$rs = odbc_exec($db, $sqlquery);
}
der Trigger würde lauten:
my_calculate_sum2($ID, $gtabid, $new_value, $old_value);