Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Gespeicherte Prozeduren, Trigger, Batches und benutzerdefinierte Funktionen » Trigger

 

Trigger für Tabellen erstellen (SQL)

Erstellen Sie einen Trigger für eine Tabelle mit der CREATE TRIGGER-Anweisung. Der Hauptteil eines Triggers besteht aus einer zusammengesetzten Anweisung: Einer Gruppe von durch Semikola getrennten SQL-Anweisungen, die zwischen eine BEGIN- und END-Anweisung gesetzt werden.

Voraussetzungen

Sie müssen das CREATE ANY TRIGGER-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg haben. Außerdem müssen Sie der Eigentümer der Tabelle sein, aus der der Trigger erstellt wird, oder eines der folgenden Privilegien haben:

  • ALTER-Privileg für die Tabelle
  • ALTER ANY TABLE-Systemprivileg
  • ALTER ANY OBJECT-Systemprivileg

Kontext und Bemerkungen

COMMIT und ROLLBACK sowie manche ROLLBACK TO SAVEPOINT-Anweisungen sind in einem Trigger nicht gestattet.

 Aufgabe
  1. Stellen Sie eine Verbindung mit der Datenbank her.

  2. Führen Sie eine CREATE TRIGGER-Anweisung aus.

Ergebnisse

Der neue Trigger wird erstellt.

Beispiel

  • Beispiel 1: Ein Insert-Trigger auf Zeilenebene   Der folgende Trigger ist ein Beispiel für einen INSERT-Trigger auf Zeilenebene. Er prüft, ob das für einen neuen Mitarbeiter angegebene Geburtsdatum sinnvoll ist:


    CREATE TRIGGER check_birth_date
       AFTER INSERT ON Employees
    REFERENCING NEW AS new_employee
    FOR EACH ROW
    BEGIN
         DECLARE err_user_error EXCEPTION
       FOR SQLSTATE '99999';
       IF new_employee.BirthDate > 'June 6, 2001' THEN
              SIGNAL err_user_error;
       END IF;
    END;

    Hinweis

    In der SQL Anywhere-Beispieldatenbank ist möglicherweise bereits ein Trigger namens "check_birth_date" vorhanden. Falls dies der Fall ist und Sie versuchen, die obenstehende SQL-Anweisung auszuführen, wird ein Fehler des Inhalts zurückgegeben, dass die Triggerdefinition in Konflikt zu bestehenden Triggern steht.

    Dieser Trigger wird ausgelöst, nachdem eine Zeile in die Tabelle "Employees" eingefügt wurde. Er erkennt und verbietet neue Zeilen, die Geburtsdaten nach dem 06.06.01 enthalten.

    Die Phrase REFERENCING NEW AS new_employee ermöglicht die Bezugnahme von Anweisungen im Triggercode auf Daten in der neuen Zeile mit dem Alias new_employee.

    Wenn ein Fehler gemeldet wird, werden die Trigger-auslösende Anweisung und alle vorherigen Wirkungen des Triggers ungültig.

    Für eine INSERT-Anweisung, die der Tabelle "Employees" viele Zeilen hinzufügt, wird der Trigger "check_birth_date" einmal für jede neue Zeile ausgelöst. Wenn der Trigger für eine der Zeilen fehlschlägt, werden alle Wirkungen der INSERT-Anweisung zurückgesetzt.

    Sie können festlegen, dass der Trigger auslöst, bevor die Zeile eingefügt wird, und nicht danach, indem Sie die zweite Zeile des Beispiels wie folgt ändern:

    BEFORE INSERT ON Employees

    Die Klausel REFERENCING NEW bezieht sich auf die eingefügten Werte der Zeile und ist unabhängig von der Zeitfolge (BEFORE oder AFTER) des Triggers.

    Manchmal ist es einfacher, Integritätsregeln mithilfe von deklarativer referenzieller Integrität oder CHECK-Integritätsregeln zu erzwingen, anstelle von Triggern. Die Umsetzung des oben genannten Beispiels mit einer Prüf-Integritätsregel auf Spalten bietet beispielsweise bessere Performance und ist klarer.

    CHECK (@col <= 'June 6, 2001')

  • Beispiel 2: Ein Beispiel für einen DELETE-Trigger auf Zeilenebene   Die folgende CREATE TRIGGER Anweisung definiert einen DELETE-Trigger auf Zeilenebene:
    CREATE TRIGGER mytrigger 
    BEFORE DELETE ON Employees
    REFERENCING OLD AS oldtable
    FOR EACH ROW
    BEGIN
       ...
    END;

    Die Klausel REFERENCING OLD ist unabhängig von der Zeitplanung des Triggers (BEFORE oder AFTER) und ermöglicht es dem DELETE-Triggercode, sich mit dem Alias "oldtable" auf die Werte in der zu löschenden Zeile zu beziehen.

  • Beispiel 3: Ein Beispiel für einen UPDATE-Trigger auf Anweisungsebene   Die folgende CREATE TRIGGER-Anweisung ist für UPDATE-Trigger auf Anweisungsebene geeignet:
    CREATE TRIGGER mytrigger AFTER UPDATE ON Employees
    REFERENCING NEW AS table_after_update
                OLD AS table_before_update
    FOR EACH STATEMENT
    BEGIN
       ...
    END;

    Die Klausel REFERENCING NEW und REFERENCING OLD ermöglicht dem UPDATE-Triggercode die Bezugnahme auf die alten und neuen Werte der zu aktualisierenden Zeilen. Der Tabellenalias table_after_update bezieht sich auf Spalten in der neuen Zeile, der Tabellenalias table_before_update auf Spalten in der alten Zeile.

    Die Klausel REFERENCING NEW und REFERENCING OLD hat eine leicht unterschiedliche Bedeutung für Trigger auf Anweisungsebene und Zeilenebene. Für Trigger auf Anweisungsebene sind die Aliase REFERENCING OLD oder NEW Tabellenaliase, während sie sich bei Triggern auf Zeilenebene auf die geänderte Zeile beziehen.


 Siehe auch