## Datenbanktrigger

Datenbanktrigger sind Programme, die implizit nach Ausführung einer INSERT-, UPDATE- oder DELETE-Anweisung auf einer Basistabelle starten. Ein Trigger kann mehrere SQL-Anweisungen enthalten und dem Anwendungsentwickler stehen eine Reihe von Kontrollstrukturen zur Verfügung. Sie können z.B. Schleifen oder Verzweigungen innerhalb eines Triggers programmieren.

Wenn Sie z.B. für eine Basistabelle einen Trigger definieren, der bei jedem INSERT angestoßen wird, so werden automatisch nach jedem neuen Eintrag in diese Tabelle die innerhalb des Triggers definierten Aktionen ausgeführt. Sie können die Ausführung eines Triggers von bestimmten Vorbedingungen abhängig machen. UPDATE-Trigger können Sie auch nur für die Änderung einzelner Spalten formulieren.

Trigger können Sie z.B. verwenden, um Werte vor ihrem Eintrag auf ihre Eignung zu überprüfen oder Werte vor ihrem Ändern zu sichern. Bei der Programmierung eines Triggers können Sie daher sowohl auf den neuen als auch auf den alten Spaltenwert zugreifen.

Nach der Definition eines Triggers müssen Sie diesen einer Basistabelle oder einzelnen Spalten sowie einer Aktion wie INSERT, UPDATE, DELETE zuordnen.

Um einen Trigger für Tabellen definieren zu können, müssen Sie Eigentümer der Tabelle sein und das Recht besitzen, die innerhalb des Triggers definierten Aktionen auszuführen.

Schlägt die Ausführung eines Triggers fehl, wird die dazugehörige INSERT-, UPDATE- oder DELETE-Anweisung durch ein ROLLBACK zurückgesetzt.

Ein Trigger kann implizit weitere Trigger und explizit auch Datenbankprozeduren aufrufen.

### Voraussetzungen

Sie benötigen die Demo-Daten für das SQL-Tutorial.

Starten Sie das Query Tool SQL Studio als Datenbankadministrator MONA mit dem Kennwort RED und melden Sie sich an die Demo-Datenbankinstanz DEMODB an.

### Anlegen eines Datenbanktriggers

Zum Anlegen eines Datenbanktriggers verwenden Sie die CREATE TRIGGER-Anweisung.

CREATE TRIGGER hotel_update FOR hotel.hotel AFTER UPDATE EXECUTE
(TRY
IF NEW.hno <> OLD.hno
THEN UPDATE hotel.room SET hno = :NEW.hno WHERE hno = :OLD.hno;
CATCH
IF $rc <> 100
THEN STOP ($rc, 'unexpected error');)

Der Trigger sorgt dafür, dass beim Ändern einer Hotelnummer in der Tabelle hotel die Änderung der Hotelnummer in der Tabelle room ebenfalls durchgeführt wird.

#### Erläuterung

● Nach dem Schlüsselwort AFTER wird das Trigger-Ereignis UPDATE angegeben. Das Trigger-Ereignis UPDATE bewirkt für jede Änderung einer Zeile der Tabelle hotel eine Ausführung des Triggers.

● Nach dem Schlüsselwort EXECUTE werden die SQL-Anweisungen und Kontrollstrukturen (in diesem Beispiel IF-Anweisungen) definiert, die zum Ausführen des gewünschten Triggers erforderlich sind.

● Fehlerbehandlung: Wenn in der Anweisungsfolge zwischen TRY und CATCH ein SQL-Fehler auftritt, wird unverzüglich in die auf das CATCH folgende Anweisung verzweigt. In dieser Anweisung kann die eigentliche Fehlerbehandlung programmiert werden.

● Sie können die neue Hotelnummer NEW.hno und die alte Hotelnummer OLD.hno verwenden.

● Die $rc-Variable liefert nach der Ausführung der UPDATE-Anweisung einen numerischen Fehlercode zurück. Der Wert 0 bedeutet, dass die Anweisung erfolgreich ausgeführt wurde.

● Eine IF-Anweisung wertet zunächst die Suchbedingung aus. Ist diese erfüllt, so wird die im THEN-Zweig definierte Anweisung ausgeführt, andernfalls wird - wenn vorhanden - die Anweisung im ELSE-Zweig ausgeführt.

Siehe auch:

SQL-Referenzhandbuch, CREATE TRIGGER-Anweisung (create_trigger_statement)

SQL-Referenzhandbuch, Routine (routine)

Systemtabellen auswerten, TRIGGERS

### Ausführen eines Datenbanktriggers

Der Datenbanktrigger hotel_update wird automatisch gestartet, sobald Änderungen der Hotelnummer in der Tabelle hotel mittels einer UPDATE-Anweisung durchgeführt werden.

### Löschen eines Datenbanktriggers

Zum Löschen eines Datenbanktriggers verwenden Sie die DROP TRIGGER-Anweisung.

DROP TRIGGER hotel_update OF hotel

Mit Hilfe dieser SQL-Anweisung löschen Sie die Triggerdefinition. Die Tabelleninhalte werden dabei nicht berührt.

Siehe auch:

SQL-Referenzhandbuch, DROP TRIGGER-Anweisung (drop_trigger_statement)

Weitere Beispiele zur Datendefinition