In unseren Schulungen klagen die Teilnehmer häufig über das Mutating Table Problem.Man möchte ja nur mal in der Tabelle etwas nachsehen, auf der der Trigger liegt.
Nur leider quittiert der Trigger einen DML Aufruf mit der folgenden Fehlermeldung:
Lassen Sie uns als Beispiel folgende Problemstellung lösen:
In der klassischen EMP Tabelle wird eine Spalte hinzugefügt mit dem Namen job_chef. In die soll, wenn die Spalte mgr gefüllt wurde, auch automatisch der Beruf des Vorgesetzten eingetragen werden. (Für alle, die die Tabelle nicht so gut kennen, sei gesagt, dass in der Spalte mgr die Nummer des Vorgesetzten steht)Man müsste nun eigentlich nur mal kurz nachsehen, was für einen Beruf der Chef hat, aber da kommt uns das Mutating Table Problem in die Quere.
Man kann das Problem jetzt über 2 Lösungsansätze angehen.
Variante 1:
Wir legen uns erstmal eine Spalte mit Namen job_chef an:
Dann erstellen wir uns ein Package, dass die komplette! Tabelle in ein Array schreibt. (Vorsicht, bei grossen Tabellen, kann der Hauptspeicher zur neige gehen)
Dann brauchen wir einen Statement Trigger, denn der hat das Mutating Table Problem nicht. Der lädt die Daten in eine Collection in den Speicher.
Und nun kommt der eigentliche Trigger ins Spiel. Der braucht jetzt nicht die eigene Tabelle befragen, sondern holt sich die Daten aus dem Speicher.
Variante 2:
Das ist jetzt ein bisschen gefährlich, denn wir tricksen das Mutating Table Problem, mit dem Compiler Hinweiß:PRAGMA AUTONOMOUS_TRANSACTION aus. Hier wird für den Trigger eine eigene Session geöffnet, die dann dasMutating Table Problem nicht hat. Wenn sich aber die Jobbezeichnung des Chefs während des Updates auch ändert, erwischt man u.U. den falschen Wert.
Weitere Tipps und Tricks erhalten Sie z.B. in unserem PL/SQL Kurs oder PL/SQL II Kurs