CREATE-TRIGGER

Ein DML-Datenbanktrigger, auch kurz als TRIGGER bezeichnet, ist eine in der Datenbank gespeicherte Prozedur, die nach INSERT-, UPDATE- oder DELETE-Anweisungen? automatisch angestoßen wird.

Bei ROW TRIGGERN stellen Transitionsvariablen OLD und NEW einen sehr komfortablen Weg dar, auf den alten und neuen Zustand des aktuel manipulierten Datensatzes zuzugreifen, wie es z.B. im zweiten Beispiel auch für die Prüfung transitionaler Integritätsbedingungen notwendig ist. Bei der Integritätsprüfung mittels Triggern spielt der Befehl RAISE_APPLICATION_ERROR eine zentrale Rolle, mittels ihm wird der Trigger im Fehlerfall abgebrochen, und hat damit ein zur IMMEDIATE Integritätsprüfung mittels CONSTRAINT]]s analoges Verhalten zur Folge: der fehlererzeugende DML-Befehl wird rückgängig gemacht und somit bleibt die Konsistenz der Daten erhalten. (vgl. Ausführungsmodell)

Wird eine TRIGGER für mehrere Ereignisse programmiert, so besteht im Aktionsteil mittels der PL/SQL-Funktionen INSERTING?, UPDATING, DELETING die Möglichkeit, zwischen dem aktuell feuernden Ereignis zu differenzieren.

Weitere Informationen zu den Hintergründen der einzelnen Klauseln sind bei den TRIGGERN zu finden und zur Theorie bei den ECMA-Regeln. Die optionale <Oracle-Reihenfolge Klausel> ist Oracle-spezifisch und beim SQL-Standard nicht zu finden. Dort wird die Reihenfolge über den Zeitpunkt der Triggererstellung geregelt, also über die creation time. Bei Oracle über eine partielle Reihenfolge. In einem Trigger kann in der Regel kein COMMIT abgesetzt werden, da er ein Bestandteil einer Transktion ist. Eine Ausnahme bilden hier die autonomen Transaktionen, die unter Oracle über die Klausel PRAGMA-AUTONOMOUS-TRANSACTION eingestellt werden können.

SQL-/Oracle-Syntax der DML-TRIGGER:

    <CREATE TRIGGER Anweisung> ::=
CREATE TRIGGER Triggername
{ BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [OF [Spaltenname [ , Spaltenname]... ]] } ON { Tabellenname | änderbareSichtname }
[ <Referenz Klausel> ]
[ <Oracle-Reihenfolge Klausel> ]
[ FOR EACH { ROW | STATEMENT } ]
[ WHEN ( <Trigger Bedingung> ) ]
[PRAGMA-AUTONOMOUS-TRANSACTION]

[ BEGIN ATOMIC ]
<SQL prozedurale Anweisung>; [ <SQL prozedurale Anweisung>; ]...
[ END ]; <Referenz Klausel> ::=
OLD [ ROW ] [ AS ] Zeilenalias_alter_Wert
| NEW [ ROW ] [ AS ] Zeilenalias_neuer_Wert
| OLD TABLE [ AS ] Tabellenalias_alter_Wert
| NEW TABLE [ AS ] Tabellenalias_neuer_Wert <Oracle-Reihenfolge Klausel> ::=
FOLLOWS | PRECEDES [Triggername [, Triggername]...]

Beispiele:

Folgeverarbeitung:

   -- Bei Manipulationen des Betrags einer Rechnungsposition
   -- wird der Gesamtbetrag der Rechnung aktualisiert.
   CREATE OR REPLACE TRIGGER rg_summe_trg
   AFTER INSERT OR UPDATE OF betrag 
   ON rechnungsposition
   FOR EACH ROW
   BEGIN
      UPDATE rechnungen 
         SET rechnungssumme := rechnungssumme - NVL(:OLD.betrag, 0) + :NEW.betrag;
   END;

Integritaetspruefung|Integritätsprüfung

   -- Es wurde eine Mindestgehaltserhöhung von 1,5% vereinbart.
   CREATE OR REPLACE TRIGGER gehalts_trg
   BEFORE UPDATE OF gehalt ON angestellte
   FOR EACH ROW
   WHEN ( (OLD.gehalt *1.015) > NEW.gehalt )
   BEGIN
      RAISE_APPLICATION_ERROR 
           (-20001, 'Lt. Tarifvertrag für 2001 muss die Gehaltserhöhung mindestens 1,5% betragen. ');
   END;

Pflege von Daten:

   -- Der Benutzerstempel wird für Einfügungen und Änderungen automatisch gesetzt.
   -- Mit diesem Trigger werden bereits durch den Anwender gemachte Eingaben überschrieben.
   -- Diese Daten sind immer korrekt, eine Manipulation durch Anwender ist ausgeschlossen.
   CREATE OR REPLACE TRIGGER angestelle_stempel_trg
   BEFORE INSERT OR UPDATE ON angestellte
   FOR EACH ROW
   BEGIN
      IF INSERTING THEN
         eingefuegt_am  := SYSDATE;
         eingefuegt_von := USER;
      ESEIF UPDATING THEN
         geaendert_am  := SYSDATE;
         geaendert_von := USER;
      END IF;
   END;

siehe auch: TRIGGER, ECMA-Regeln, Ausführungsmodell, NON-DML-TRIGGER?, INSTEAD OF-Trigger

Quellen:

  • Faeskorn-Woyke, Heide; Bertelsmeier, Birgit; Riemer, Petra; Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Feuerstein, Steven, Pribyl. Bill: "Oracle PL/SQL Programming", O'Reilly, 2009, ISBN-13: 978-0596514464
  • Oracle® Database SQL Language Reference 11g Release 1 (11.1) in http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
  • Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) in http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • Saurabh, Gupta: "Oracle Advanced PL/SQL Developer Professional Guide", Packt Publishing Limited, 2012, ISBN 978-1-84968-722-5

Kategorie: Aktive Datenbanken, Oracle-PL-SQL, C