Trigger

Aus Limbas Wiki

Wechseln zu: Navigation, Suche

<-- zurück zu Admin-Dokumentation / <-- zurück zur Hauptseite


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.

Trigger Abb1.png

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.

Trigger Abb2.png

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!

Trigger Abb3.png

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);