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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Gespeicherte Prozeduren und Trigger » Prozeduren, Trigger und Batches verwenden » Einführung in Trigger

 

Trigger erstellen

Sie können Trigger sowohl mit Sybase Central als auch mit Interactive SQL erstellen. In Sybase Central können Sie einen Assistenten verwenden, um die erforderlichen Informationen zu erhalten. In Interactive SQL können Sie die Anweisung CREATE TRIGGER verwenden. Für beide Tools müssen Sie DBA sein oder die RESOURCE-Berechtigung haben, um einen Trigger zu erstellen sowie ALTER-Berechtigungen für die Tabelle, die dem Trigger zugeordnet ist.

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.

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

♦  So erstellen Sie einen Trigger für eine gegebene Tabelle (Sybase Central)
  1. Verbinden Sie sich mit DBA-Berechtigung oder Ressourcenberechtigung mit der Datenbank.

  2. Klicken Sie im linken Fensterausschnitt auf Trigger.

  3. Wählen Sie Datei » Neu » Trigger.

  4. Befolgen Sie die Anweisungen des Assistenten zum Erstellen von Triggern.

  5. Um den Code zu vervollständigen, klicken Sie im rechten Fensterausschnitt auf das Register SQL.

♦  So erstellen Sie einen Trigger für eine gegebene Tabelle (SQL)
  1. Verbinden Sie sich mit DBA-Berechtigung mit einer Datenbank. Sie müssen auch ALTER-Berechtigungen für die Tabelle haben, die dem Trigger zugeordnet ist.

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

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.

In manchen Fällen ist es vielleicht sinnvoll, Integritätsregeln mit deklarativer referenzieller Integrität oder CHECK-Integritätsregeln, und nicht mit Triggern, zu erzwingen. Beispiel: Die Umsetzung des oben genannten Beispiels mit einer Prüf-Integritätsregel auf Spalten bietet 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