TRIGGER
Trigger sind die zentralen Konzepte aktiver DBS. Durch Trigger werden die Daten, die nur 'statisches' Wissen darstellen können, um Abläufe aus der realen Welt, also dynamisches Verhalten erweitert.
Theoretische Hintergründe und Ideen, was alles mit aktiven Regeln machbar sein könnte, sind bei den ECMA-Regeln erläutert.
Hier werden die Trigger im Sinne des SQL-Standards und Oracle dargestellt. Bis auf ein paar Kleinigkeiten sind diese beiden Triggerkonzepte sehr analog. Sie wurden erst mit der 1999er Version in den SQL-Standard aufgenommen, das Oracle-Konzept besteht schon etwas länger. Leider beschränkt sich die Zahl der aktivierenden (feuernden) Ereignisse auch im 2003er Standard immer noch auf die drei DML-Ereignisse. Oracle hat das Kozept um die NON-DML-TRIGGER? erweitert, womit beide aber trotzdem weit hinter den theoretischen Möglichkeiten der ECMA-Regeln zurückbleiben.
Die Struktur der ECMA-Regeln findet sich beim SQL2003-Standard sowie Oracle in nachfolgend beschriebenen Trigger-Eigenschaften wieder, die in SQL wie auch bei Oracle mittels der CREATE TRIGGER-Anweisung umgesetzt werden.
Name: Triggername
Der Name kann frei gewählt werden und muss im Datenbankschema eindeutig sein. Er sollte zudem jedoch einen Bezug zu den beteiligten Tabellen und der Funktionsweise erkennen lassen, denn der Triggername wird bei Fehlermeldungen mit angezeigt.
Ausführungszeitpunkt (Modus M): BEFORE | AFTER
Der Ausführungszeitpunkt legt fest, ob ein Trigger vor oder nach dem feuernden (aktivierenden) Ereignis ausgeführt werden soll. Je nach Aufgabenstellung kann der BEFORE- oder der AFTER-Zeitpunkt sinnvoll oder gar notwendig sein. Sind Folgeverarbeitungen durchzuführen, so bieten sich AFTER TRIGGER an, da bei deren Ausführung die Integritätsbedingungen bereits geprüft wurden. Sollen die Werte des neuen Datensatzes geändert oder ergänzt werden, so bietet es sich hingegen an, in den BEFORE TRIGGER die Transitionsvariablen mit entsprechenden Werten zu belegen. Die durch das Ereignis gefeuerten Trigger (auch die kaskadierenden) und das feuernde Ereignis selbst stellen eine atomare Ausführungseinheit dar. Schlägt einer der gefeuerten Trigger oder das Ereignis selber fehl, dann wird alles – Ereignis samt gefeuerter und auch ausgeführter Trigger – rückgängig gemacht. (vgl. Ausführungsmodell)
Oracle kennt noch den INSTEAD OF-Modus bei dem der Name Programm ist: Trigger mit INSTEAD OF-Modus werden anstelle des feuernden Ereignisses ausgeführt. Ihr Anwendungsgebiet sind Manipulationsanweisungen für Daten von komplexeren Views, den sogenannten nicht änderbaren Sichten, da hat der Programmierer dann die Möglichkeit, im Aktionsteil des Trigges die passenden DML-Anweisungen für die zugrundeliegenden Tabellen zu definieren.
Ausführungszeitpunkt (Modus M): FOR EACH {ROW | STATEMENT}
Ebenfalls zum Ausführungszeitpunkt gehört die Klausel zur Bestimmung, ob es sich um einen zeilenorientierten Trigger oder einen befehlsorientierten handelt. Wird diese Klausel bei Oracle nicht angegeben, so handelt es sich dafault-mäßig um einen STATEMENT-Trigger und wenn es ein ROW-Trigger handeln soll, dann muss die FOR EACH ROW-Klausel spezifiziert werden. (vgl. Ausführungsmodell)
Die WHEN-Bedingung und die Transitionsvariablen sind nur für ROW-Trigger nutzbar.
Ereignis (Event E): INSERT | DELETE | UPDATE OF …
Von den vielen bei den ECMA-Regeln diskutierten Ereignissen sind bei SQL nur drei zugelassen, und zwar die Manipulationsanweisungen INSERT, UPDATE, DELETE. Ein Trigger kann in SQL nur zu einem einzigen Ereignis programmiert werden. Die Ereignisse gelten nur für die in der ON-Klausel mit „Tabellenname“ spezifizierten Tabelle. Das UPDATE-Ereignis lässt sich für die Änderung ganz bestimmter Spalten weiter eingrenzen, wobei die Spalten natürlich Spalten der Tabelle aus der ON-Klausel sein müssen.
Bei Oracle lassen sich die DML-Trigger auch für eine beliebige Variation dieser drei Ereignisse programmieren. Zudem bietet Oracle die sog. NON-DML-TRIGGER? an, die für DDL- und Datenbankanweisungen feuern.
Tabelle: ON Tabellenname | änderbareSichtname
Der Tabellenname ist der Name einer Basistabelle (feuernde Tabelle). Trigger auf Sichten oder temporäre Tabellen sind nicht erlaubt. Genauso wie ein Trigger nur für ein Ereignis definiert werden kann, ist er auch nur für genau eine Tabelle spezifizierbar. Obwohl ein Trigger ein eigenständiges Datenbankobjekt ist, ist er mit der feuernden Tabelle „verbunden“, so dass er ohne die Tabelle nicht existieren kann, was heißt, dass beim Löschen einer Tabelle auch ihre Trigger gelöscht werden, aber nicht umgekehrt. Ein Trigger wird vom Trigger-Monitor gefeuert, wenn für die Tabelle das zuvor spezifizierte Ereignis eintritt.
Referenz-Klausel
Die optionale Referenz-Klausel ermöglicht es, den Transititionstabellen und -variablen einen anderen Namen zu geben als OLD und NEW.
Bedingung (Condition C): [WHEN ( <Trigger Bedingung> ) ]
Die Bedingung ist optional. Wird sie spezifiziert, dann muss sie erfüllt sein, sonst wird der Aktionsteil des gefeuerten Triggers nicht ausgeführt. Die WHEN-Bedingung ist bei Oracle nur für ROW-Trigger vorgesehen. Es sind Bedingungen zugelassen, wie sie auch in der WHERE-Klausel von SELECT-Anfragen zugelassen sind. Wobei SELECT-Anfragen selbst nicht zugelassen sind. Die Transitionsvariablen hingegen sind verwendbar. Die WHEN-Klausel ist nur für ROW-Trigger nutzbar.
Aktionsteil (Action A): BEGIN ... END
Der Aktionsteil enthält die Ausführungslogik, die ausgeführt werden soll, wenn das feuernde Ereignis eintritt. Bei Oracle können hier PL/SQL-Befehle programmiert werden, PL/SQL-Prozeduren und -Funktionen sowie Java-Programme aufgerufen werden.
Erweiterung findet dieses Konzept bei Oracle in dem DML-Trigger INSTEAD OF sowie den NON-DML-TRIGGERN?.
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, SQL, Oracle-PL-SQL, T