INSTEAD OF TRIGGER (Oracle)

Neben den BEFORE- und AFTER-DML-Triggern, die vor bzw. nach dem feuernden Ereignis ausgeführt werden, gibt es bei Oracle, IBM DBS 2 und Microsoft SQL Server - nicht beim SQL-Standard - noch die INSTEAD OF-Trigger, die anstelle des feuernden Ereignisses ausgeführt werden.

Mit INSTEAD OF-Triggern haben Entwickler die Möglichkeit, bei nicht änderbaren Sichten, die zu dem DML-Ereignis auf der Sicht gehörigen DML-Aktionen auf den zugrundeliegenden Tabellen zu programmieren und bei jedem Äanderungsereignis auf der Sicht auszuführen zu lassen. Für den Anwender erscheint es dann so, als ob die Sichtdaten geändert werden, dabei werden mit den Triggern die zugrundeliegenden Tabellendaten geändert. INSTEAD-OF-Trigger können nicht direkt für Tabellen definiert werden.

Mit einer fast völlig analogen CREATE TRIGGER-Anweisung werden die INSTEAD OF-Trigger angelegt. Es gelten im wesentlichen die gleichen Restriktionen und Funktionalitäten wie dort.

  • Eine Ausnahme ist, dass die INSTEAD OF-Trigger nicht für Tabellen definiert werden, sondern nur für nicht änderbare Sichten.
  • Per Definition sind INSTEAD OF TRIGGER datensatzorientierte ROW-Level-Trigger (Default FOR EACH ROW-Klausel, zeilenorientierter Trigger), in denen die Transitionsvariablen :OLD und :NEW zur Verfügung stehen. Durch sie wird es möglich, innerhalb der Triggeraktion auf die Werte der manipulierten Sichtdaten zuzugreifen und diese ggf. für die selbstprogrammierten DML-Operationen auf den zugehörigen Tabellen zu verwenden.
  • Es muss unbedingt darauf geachtet werden, dass eine saubere Ausnahmebehandlung vorgenommen wird, da sie oft für Zwecke eingesetzt werden, bei der das DMBS etwas anderes vortäuscht, als tatsächlich geschieht.
  • Es gibt keine BEFORE | AFTER-Klausel als Ausführungszeitpunkt wie bei den Tabellentriggern.

Das Ausführungsmodell der INSTEAD OF-Trigger ist analog zu dem der BEFORE- und AFTER-TRIGGER, nur mit dem Unterschied, dass sie anstelle der feuernden DML-Operation ausgeführt werden und nicht davor oder danach.

Oracle-Syntax der INSTEAD OF-TRIGGER:

    <CREATE TRIGGER Anweisung> ::=
CREATE TRIGGER Triggername
{ INSTEAD OF }
{ INSERT | DELETE | UPDATE [OF [Spaltenname [ , Spaltenname]... ]] } ON Sichtname
[ <Referenz Klausel> ]
[ WHEN ( <Trigger Bedingung> ) ]
[ BEGIN ATOMIC ]
<SQL prozedurale Anweisung>; [ <SQL prozedurale Anweisung>; ]...
[ END ];

Beispiel:

     CREATE OR REPLACE TRIGGER angestellte_view_ins
     INSTEAD OF INSERT ON ang_abt_view
     FOR EACH ROW
     BEGIN
        INSERT INTO angestellte VALUES (...);
        UPDATE abteilungen SET ...;
        ... 
     END;

siehe auch: Sichtaenderungen - InsteadOfTrigger

Quellen:

Kategorie Aktive Datenbanken, I