Firebird Documentation IndexFirebird 2.5 SprachreferenzProzedurale SQL-Anweisungen (PSQL) → Trigger
Firebird Home Firebird Home Zurück: PSQL-BlöckeFirebird Documentation IndexNach oben: Prozedurale SQL-Anweisungen (PSQL)Weiter: Schreiben des Body-Codes

Trigger

Inhaltsverzeichnis

Reihenfolge der Ausführung
DML-Trigger
Datenbank-Trigger
Trigger erstellen
Trigger ändern
Trigger löschen

Ein Trigger ist eine andere Form von ausführbarem Code, der in den Metadaten der Datenbank zur Ausführung durch den Server gespeichert wird. Ein Trigger kann nicht direkt aufgerufen werden. Er wird automatisch aufgerufen („gefeuert“), wenn Datenänderungsereignisse mit einer bestimmten Tabelle oder Sicht (View) auftreten.

Ein Trigger gilt für genau eine Tabelle oder Sicht und nur eine Phase in einem Ereignis (VOR oder NACH dem Ereignis). Ein einzelner Trigger kann nur dann ausgelöst werden, wenn ein bestimmtes Datenänderungsereignis auftritt (INSERT / UPDATE / DELETE) oder wenn es auf mehr als eines dieser Ereignisse angewendet werden soll.

Ein DML-Trigger wird im Kontext der Transaktion ausgeführt, in der die datenändernde DML-Anweisung ausgeführt wird. Bei Triggern, die auf Datenbankereignisse reagieren, ist die Regel unterschiedlich: Für einige von ihnen wird eine Standardtransaktion gestartet.

Reihenfolge der Ausführung

Für jede Phase-Ereignis-Kombination kann mehr als ein Trigger definiert werden. Die Reihenfolge, in der sie ausgeführt werden (bekannt als „firing order“, kann explizit mit dem optionalen Argument POSITION in der Triggerdefinition angegeben werden.) Sie haben 32.767 Nummern zur Auswahl. Die niedrigsten Positionsnummern feuern zuerst.

Wenn eine Klausel POSITION weggelassen wird oder mehrere übereinstimmende Ereignisphasen-Trigger die gleiche Positionsnummer haben, werden die Trigger in alphabetischer Reihenfolge ausgelöst.

DML-Trigger

DML-Trigger sind solche, die ausgelöst werden, wenn eine DML-Operation den Datenstatus ändert: Zeilen in Tabellen ändern, neue Zeilen einfügen oder Zeilen löschen. Sie können sowohl für Tabellen als auch für Ansichten definiert werden.

Trigger-Optionen

Für die Ereignis-Phasen-Kombination für Tabellen und Ansichten stehen sechs Basisoptionen zur Verfügung:

Bevor eine neue Zeile eingefügt wird (BEFORE INSERT)
Nachdem eine neue Zeile eingefügt wurde (AFTER INSERT)
Bevor eine Zeile aktualisiert wird (BEFORE UPDATE)
Nachdem eine Zeile aktualisiert wurde (AFTER UPDATE)
Bevor eine Zeile gelöscht wird (BEFORE DELETE)
Nachdem eine Zeile gelöscht wurde (AFTER DELETE)

Diese Basisformulare dienen zum Erstellen von Einzelphasen- / Einzelereignisauslösern. Firebird unterstützt auch Formulare zum Erstellen von Auslösern für eine Phase und mehrere Ereignisse, z. B. BEFORE INSERT ODER UPDATE ODER DELETE, oder AFTER UPDATE ODER DELETE: Die Kombinationen unterliegen Ihrer Wahl.

Anmerkung

Multiphasen-“-Trigger, wie BEFORE OR AFTER..., sind nicht möglich.

Kontextvariablen OLD und NEW

Für DML-Trigger bietet die Firebird-Engine Zugriff auf Sätze von OLD- und NEW-Kontextvariablen. Jedes ist ein Array der Werte der gesamten Zeile: eine für die Werte, wie sie vor dem Datenänderungsereignis sind (die BEFORE-Phase) und eine für die Werte, wie sie nach dem Ereignis sein werden (die AFTER-Phase). Sie werden in Anweisungen referenziert, die das Formular NEW.column_name bzw. OLD.column_name verwenden. column_name kann eine beliebige Spalte in der Definition der Tabelle sein, nicht nur die, die gerade aktualisiert wird.

Die Variablen NEW und OLD unterliegen einigen Regeln:

  • In allen Triggern ist der OLD-Wert schreibgeschützt
  • In BEFORE UPDATE und BEFORE INSERT Code wird der NEW-Wert gelesen / geschrieben, sofern es sich nicht um eine COMPUTED BY-Spalte handelt
  • In INSERT-Triggern sind Verweise auf die OLD-Variablen ungültig und lösen eine Ausnahme aus
  • In DELETE-Triggern sind Verweise auf die NEW-Variablen ungültig und lösen eine Ausnahme aus
  • In allen AFTER-Triggercodes sind die NEW-Variablen schreibgeschützt

Datenbank-Trigger

Ein mit einer Datenbank oder einem Transaktionsereignis verknüpfter Trigger kann für die folgenden Ereignisse definiert werden:

Verbindung mit einer Datenbank herstellen (ON CONNECT) Bevor der Trigger ausgeführt wird, wird automatisch eine Standardtransaktion gestartet
Trennen von einer Datenbank (ON DISCONNECT) Bevor der Trigger ausgeführt wird, wird automatisch eine Standardtransaktion gestartet
Wenn eine Transaktion gestartet wird (ON TRANSACTION START) Der Trigger wird im aktuellen Transaktionskontext ausgeführt
Wenn eine Transaktion übergeben wird (ON TRANSACTION COMMIT) Der Trigger wird im aktuellen Transaktionskontext ausgeführt
Wenn eine Transaktion abgebrochen wird (ON TRANSACTION ROLLBACK) Der Trigger wird im aktuellen Transaktionskontext ausgeführt

Trigger erstellen

Syntax: 

CREATE TRIGGER trigname {
    <relation_trigger_legacy>
  | <relation_trigger_sql2003>
  | <database_trigger> }
AS
[<declarations>]
BEGIN
[<PSQL_statements>]
END

<relation_trigger_legacy> ::= FOR {tablename | viewname}
[ACTIVE | INACTIVE]
{BEFORE | AFTER} <mutation_list>
[POSITION number]

<relation_trigger_sql2003> ::= [ACTIVE | INACTIVE]
{BEFORE | AFTER} <mutation_list>
[POSITION number]
ON {tablename | viewname}

<database_trigger> ::= [ACTIVE | INACTIVE]
ON db_event
[POSITION number]

<mutation_list> ::= <mutation> [OR <mutation>
   [OR <mutation>]]

<mutation> ::= { INSERT | UPDATE | DELETE }

<db_event> ::=
    CONNECT
  | DISCONNECT
  | TRANSACTION START
  | TRANSACTION COMMIT
  | TRANSACTION ROLLBACK
        

Der Header muss einen Namen für den Trigger enthalten, der unter den Triggernamen eindeutig ist. Er muss das Ereignis oder die Ereignisse enthalten, die den Auslöser auslösen. Für einen DML-Trigger müssen Sie außerdem die Ereignisphase und den Namen der Tabelle oder Ansicht angeben, die den Trigger „besitzen“ soll.

Der Rumpf des Triggers kann durch die Deklarationen von lokalen Variablen und Cursorn, falls vorhanden, geleitet werden. Innerhalb des umschließenden Hauptblocks von BEGIN ... END befinden sich ein oder mehrere Blöcke von PSQL-Anweisungen, die leer sein können.

Weitere Informationen zum Erstellen von Triggern:  Siehe ">CREATE TRIGGER in Kapitel 5, Data Definition (DDL) Statements.

Trigger ändern

Das Ändern der Status-, Phasen-, Tabellen- oder Ansichtsereignisse, der Auslöseposition und des Codes im Rumpf eines DML-Triggers ist möglich. Sie können jedoch einen DML-Trigger nicht ändern, um ihn in einen Datenbank-Trigger zu konvertieren, und umgekehrt. Jedes nicht angegebene Element wird von ALTER TRIGGER nicht geändert. Die alternativen Anweisungen CREATE OR ALTER TRIGGER und RECREATE TRIGGER ersetzen die ursprüngliche Triggerdefinition vollständig.

Syntax: 

ALTER TRIGGER trigname
[ACTIVE | INACTIVE]
[{BEFORE | AFTER} <mutation_list>]
[POSITION number]
[
 AS
 [<declarations>]
 BEGIN
 [<PSQL_statements>]
 END
]

<mutation_list> ::= 
  <mutation> [OR <mutation> [OR <mutation>]]

<mutation> ::= { INSERT | UPDATE | DELETE }

<db_event> ::=
    CONNECT 
  | DISCONNECT
  | TRANSACTION START
  | TRANSACTION COMMIT
  | TRANSACTION ROLLBACK
        

Weitere Informationen zum Ändern von Triggern:  Siehe ALTER TRIGGER, CREATE OR ALTER TRIGGER, RECREATE TRIGGER in Kapitel 5, Data Definition (DDL) Statements.

Trigger löschen

Die Anweisung DROP TRIGGER dient zum Löschen von Triggern.

Syntax (vollständig): 

DROP TRIGGER trigname;
        

Weitere Informationen zum Löschen von Triggern:  Siehe DROP TRIGGER in Kapitel 5, Data Definition (DDL) Statements.

Zurück: PSQL-BlöckeFirebird Documentation IndexNach oben: Prozedurale SQL-Anweisungen (PSQL)Weiter: Schreiben des Body-Codes
Firebird Documentation IndexFirebird 2.5 SprachreferenzProzedurale SQL-Anweisungen (PSQL) → Trigger