Oracle: Trigger kann nicht auf Tabelle zugreifen, auf der er liegt

sceppi

Mitglied
Hallo,
ich habe mal wieder ein Trigger Problem.
Und zwar muss der Trigger aus der Tabelle holen, auf der er liegt. Die Verwendung schon :new und/oder :eek:ld scheidet aus.
Ich brauche aus der geänderten Tabelle Werte, aber immer unterschiedlich. Diese Werte werden nicht im Trigger sondern in einer vom Trigger aufgerufenen Prozedur geholt und verarbeitet.
Erstelle ich den Trigger jetzt mit Befor, sind die Daten noch nicht da. Logisch.
Verwende ich aber After, kommt folgender Fehler:
Code:
ORA-04091: Tabelle TEST.TEST wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht
Kann man das irgendwie umgehen?

p.s. bei der Anweisung in der Prozedur handelt es sich um eine reine Select-Anweisung.
 
Das Problem der "Mutating Table" ist in der Regel ein Anzeichen für eine schlechte Programmlogik oder versteckte Bugs. Was passiert z.B. mit deiner Funktion wenn von 2 Usern gleichzeitig der Trigger ausgeführt wird?

Sicher gibt es einen Weg das Problem zu umgehen (http://asktom.oracle.com/tkyte/Mutate/index.html), besser wäre aber nochmal das Vorgehen zu überdenken. Beschreibe doch am besten mal genauer, was dein Trigger genau tun soll...
 
ok,
der trigger reagiert auf alle DML Anweisungen.
Er ruft eine Prozedur auf und übergibt folgende Werte:
Art der Änderung, Tabellenname, Primarykey-Wert von :new und einen bestimmten Spaltennamen.
In einer Prozdur werden dann verschiedene Sachen gemacht.
Unteranderem soll der Wert aus der Spalte mit Hilfe der :new.ID geholt werden und in einer anderenTabelle gespeichert werden. Der Spaltennamen ändert sich jedoch immer, da die Prozedur rin Packet ist und nur die Trigger je Tabelle angepasst werden können. Im Trigger ist der benötigte Spaltenname fest "verdrahtet.
 
Hallo,
ich habe mir die mögliche Lösung einmal angeschaut. Leider kann ich sie nicht verwenden, da ich keine großen Eingriffe in die Datenbankstruktur vornehmen kann (neue Tabellen erstellen).
Ich werde irgendwie versuchen, die Werte mit als Parameter zu übergeben, habe dabei aber wieder das Problem, dass es keine mehrdimensionalen Arrays gibt. Ich muss ja Spaltenname und Wert übergeben.
 
Zurück