Die CREATE TRIGGER-Anweisung (create_trigger_statement) definiert einen Trigger für eine Basistabelle (siehe Tabelle).
<create_trigger_statement> ::= CREATE TRIGGER <trigger_name> FOR
<table_name>
AFTER <trigger_event,..> EXECUTE (<routine>) [WHENEVER
<search_condition> ]
<trigger_event> :: INSERT | UPDATE [(<column_list>)] | DELETE
<column_list> ::= <column_name> |
<column_list>,<column_name>
trigger_name, table_name, search_condition, routine, column_name
Der Trigger sorgt dafür, dass beim Ändern einer Hotel-Nummer in der Tabelle hotel die Änderung der Hotel-Nummer in der Tabelle room ebenfalls durchgeführt wird.
CREATE TRIGGER hotel_update FOR hotel AFTER UPDATE EXECUTE (
TRY
IF NEW.hno <> OLD.hno
THEN UPDATE travel.room SET hno = :NEW.hno WHERE hno =
:OLD.hno;
CATCH
IF $rc <> 100
THEN STOP ($rc, 'unexpected error');
)
Ein Trigger ist eine spezielle Datenbankprozedur, die einer Basistabelle zugeordnet ist. Diese Datenbankprozedur kann nicht explizit durch die CALL-Anweisung ausgeführt werden, sondern wird von SAP DB automatisch ausgeführt, wenn definierte Ereignisse (trigger_event) auf der Tabelle eintreten.
Zur Formulierung eines Triggers stellt SAP DB eine Sprache (spezielle SQL-Syntax, die um Variablen, Kontrollstrukturen und Möglichkeiten zur Fehlerbehandlung erweitert wurde) bereit, die verwendet werden kann, um Datenbankprozeduren und Trigger zu definieren.
Der angegebene Tabellenname muß eine existierende Basistabelle des aktuellen Benutzers bezeichnen.
Das Trigger-Ereignis (trigger_event) definiert, wodurch der Trigger ausgelöst wird. Der Aufruf des Triggers erfolgt immer nach der fehlerfreien Bearbeitung des auslösenden Ereignisses.
INSERT: Das Trigger-Ereignis INSERT bewirkt für jede Zeile, die in die Tabelle eingefügt wird, eine Ausführung des Triggers.
UPDATE: Das Trigger-Ereignis UPDATE bewirkt für jede Änderung einer Zeile der Tabelle eine Ausführung des Triggers. Wenn eine Spaltenliste (column_list) angegeben ist, erfolgt der Aufruf nur, wenn eine der in der Spaltenliste enthaltenen Spalten verändert wurde.
DELETE: Das Trigger-Ereignis DELETE bewirkt für jede gelöschte Zeile der Tabelle einen Aufruf des Triggers.
Zu jedem Trigger-Ereignis darf pro Tabelle maximal ein Trigger definiert werden.
Jeder INSERT-Trigger besitzt implizit für jede Spalte der Tabelle eine korrespondierende Variable NEW.<column_name>. Bei der Ausführung des Triggers besitzt diese Variable den Wert der korrespondierenden Spalte der eingefügten Zeile. Die Angabe von NEW ist nur für in routine_sql_statements genannte SQL-Anweisungen erlaubt. Für die anderen Anweisungen führt die Angabe von NEW zu einem Fehler.
Jeder UPDATE-Trigger besitzt implizit für jede Spalte der Tabelle die korrespondierenden Variablen NEW.<column_name> und OLD.<column_name>. Bei der Ausführung des Triggers besitzt die Variable OLD.<column_name> den Wert der korrespondierenden Spalte vor und NEW.<column_name> den Wert der Spalte nach der Änderung der Zeile. Die Angabe von NEW und OLD sind optional.
Jeder DELETE-Trigger besitzt implizit für jede Spalte der Tabelle eine korrespondierende Variable OLD.<column_name>. Bei der Ausführung des Triggers besitzt diese Variable den Wert der korrespondierenden Spalte der gelöschten Zeile. Die Angabe von OLD ist nur für in routine_sql_statements genannte SQL-Anweisungen erlaubt. Für die anderen Anweisungen führt die Angabe von OLD zu einem Fehler.
In SQL-Anweisungen (statement), die in Triggern verwendet werden und zu den in routine_sql_statements genannten Anweisungen gehören, müssen :NEW und :OLD immer mit Doppelpunkt verwendet werden (Beispielzeile UPDATE travel.room SET hno = :NEW.hno WHERE hno = :OLD.hno).
In SQL-Anweisungen (statement), die in Triggern verwendet werden und nicht zu den in routine_sql_statements genannten Anweisungen gehören, müssen NEW und OLD immer ohne Doppelpunkt verwendet werden (Beispielzeile IF NEW.hno <> OLD.hno).
Siehe auch:
Wird der Trigger durch STOP mit einer Fehlernummer ungleich Null beendet, scheitert die gesamte SQL-Anweisung, die den Trigger ausgelöst hat.
Die SUBTRANS-Anweisung ist innerhalb eines Triggers nicht zulässig.
Bei Angabe einer WHENEVER-Bedingung wird der Trigger nur ausgeführt, wenn die Suchbedingung erfüllt ist. Die Bedingung darf keine Subquery und keine Set-Funktionen enthalten.