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.
Verbinden Sie sich mit DBA-Berechtigung oder Ressourcenberechtigung mit der Datenbank.
Klicken Sie im linken Fensterausschnitt auf Trigger.
Wählen Sie Datei » Neu » Trigger.
Befolgen Sie die Anweisungen des Assistenten zum Erstellen von Triggern.
Um den Code zu vervollständigen, klicken Sie im rechten Fensterausschnitt auf das Register SQL.
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.
Führen Sie eine CREATE TRIGGER-Anweisung aus.
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; |
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') |
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.
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.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |