Trigger
Aus Limbas Wiki
Admin->Tools->Trigger → zurück zu LIMBAS Admin
Ein Trigger ist die Funktionalität bei einer Datenänderung (INSERT, UPDATE, DELETE) bestimmte, benutzerdefinierte Aktionen durchzuführen.
Die in LIMBAS eingetragenen Trigger werden in der LIMBAS-Systemtabelle "lmb_trigger" gespeichert. Für jeden Datenbank- oder LIMBAS-Trigger wird hier der Name, das Erstellungsdatum, der Ersteller, der Typ (INSERT, UPDATE, DELETE), die Definition der durchzuführenden Aktionen sowie der Aktivierungszustand gezeigt.
Beim Hinzufügen eines neuen Triggers ist die Angabe eines eindeutigen Namens, der Tabelle, auf die der Trigger angewendet werden sollen, und der Typ anzugeben. Sobald der Trigger angelegt ist, können dann nach Mausklick auf das Symbol der Spalte "Definition" die Aktionen eingegeben werden.
Durch Mausklick auf das Papierkorbsymbol eines Triggers, wird dieser gelöscht.
Datenbank-Trigger
Ein Datenbank-Trigger führt nach entsprechendem Anstoß eine Datenbankprozedur aus.
Jeder Typ (INSERT, UPDATE, DELETE) des Datenbank-Triggers kann pro Tabelle in der Datenbank nur einmal definiert werden. Sollen jedoch mehrere Aktionen durchgeführt werden, können diese hier trotzdem durch mehrere Trigger beschrieben werden.
Trigger Definitionen werden grundsätzlich in der LIMBAS-Systemtabelle "lmb_trigger" gespeichert und in einem zweiten Schritt mit den eigentlichen Datenbanktriggern syncronisiert.
Bei "speichern" werden neue/veränderte Eingaben in die LIMBAS-Systemtabelle "lmb_trigger" eingetragen, die Aktionen werden ggf. zu Prozeduren zusammengefaßt 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 Datenbank-Trigger an, die die Einträge in der zugehörigen Verknüpfungstabelle vornehmen. Verknüpfungen. Diese Systemtrigger können durch die Option "show limbas trigger" ausgeblendet werden.
LIMBAS-Trigger
Ein LIMBAS-Trigger arbeitet bei entsprechendem Anstoß PHP-Anweisungen ähnlich wie Datenbank-Trigger ab. Der Unterschied besteht darin das der Trigger im PHP code bei definierten Aktionen ausgeführt wird. So ist es möglich eigene PHP Funktionen in der gewohnten LIMBAS Umgebung und deren Funktionsumfang zu nutzen.
Falls durch eine Datenbankänderung mehrere LIMBAS-Trigger angestoßen werden, so werden diese in der hier aufgelisteten Reihenfolge ausgeführt. Durch Mausklick auf einen Pfeil in der Spalte "order" kann die Reihenfolge der Auflistung entsprechend geändert werden. Hier definierte Trigger können in den Tabelleneinstellungen global (Tabellen) oder in den Tabellenrechten gruppenbasiert (Gruppen Administrieren) zugewiesen werden. Limbas Trigger können dabei für eine Tabelle oder für einzelne Felder abgewendet werden. Ebenso werden Trigger bei Änderung von Sonderfeldtypen wie Verknüpfungen oder Mehrfach-Auswahlfelder ausgeführt
Bei Ausführung eines Triggers sind folgende Variablen verfügbar:
- $typ (INSERT | UPDATE | DELETE)
- $position (BEFORE | AFTER)
- $gtabid (Tabellen [ID])
- $fieldid (Feld [ID])
- $trigger (Trigger Definition)
- $ID (Datensatz [ID])
- $new_value (neuer Wert) - optional
- $old_value (alter Wert) Komplettes "result array" des Datensatzes - optional
- $triggerResult (Rückgabewert der eigenen Funktion) - optional
Beispiel
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)" und wählen Ihn in den Feldern Preis und Anzahl der Tabelleneinstellungen aus. In einer Extension Datei (Skript-Erweiterungen) fügen wir unsere neue Funktion hinzu.
function my_calculate_sum($ID){
global $db;
$sqlquery = "UPDATE POSITIONEN SET SUMME = (PREIS * ANZAHL) WHERE ID = $ID;
$rs = odbc_exec($db,$sqlquery);
}
