Autor Beitrag
BerndW
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 21.08.03 16:35 
Hallo,

ich brauche eure hilfe bei der Erstellung eines Triggers.

Es soll bei einem Insert oder Update der Tabelle ORTE ein Datensatz aus einer anderen Zeile der gleichen Tabelle genommen werden und dieser in die neue Zeile eingefügt werden. Oracle sagt mir dann: "Tabelle ORTE wird gerade geändert, Trigger/Funktion darf es nicht sehen ORA-06512 und ORA-04088"
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
CREATE OR REPLACE TRIGGER trig1 
before INSERT OR UPDATE ON ORTE
FOR EACH ROW
declare orn VARCHAR2(35); 
        
BEGIN 
SELECT max(Anzahl) into orn
FROM ORTE; 

:new.Anzahl:= orn; 
END;

Wenn ich aus einer anderen Tabelle einen Wert in die Tabelle ORTE schreiben will geht das. Ich kann anscheinend kein Select auf die Tabelle des ausführenden Triggers ausführen. Was kann ich tun um diesen Fehler zu umgehen?

Ich hoffe ihr könnt mir helfen.

Gruss
Bernd
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 22.08.03 12:07 
Hi!

Warum notierst du überhaupt die Anzahl der Datensätze in der Tabelle in jedem Datensatz derselben Tabelle? Ich kann mir keinen Fall vorstellen, wo das nötig wäre. Das sieht mir sehr ungeschickt aus.
Wenn du die Anzahl aller Datensätze haben willst, mach doch lieber ein "Select count(*) from orte", sobald du diese Info brauchst. Im Datensatz selber ist das überflüssig.

Cu,
Udontknow

Nachtrag:
Mein Tip: Das Feld Anzahl aus dieser Tabelle herausnehmen. Wenn du unbedingt sofort den Count zur Verfügung haben willst, schreibe ihn in eine separate Tabelle "AnzahlDS", wo für jede Tabelle die Anzahl der aktuell enthaltenen Datensätze vermerkt sind.

Wenn du unbedingt dein Feld behalten willst, dann probiere es doch mal mit einem after update.
BerndW Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 25.08.03 08:21 
Danke erstmal für deine Antwort, aber das Selectstatement war nur ein Beispiel. Es geht mir nur darum einen Datensatz aus der Tabelle auszulesen, auf der auch der Trigger liegt. Das scheint irgendwie nicht möglich zu sein.
Vielleicht wenn ich eine Procedure vom Trigger aufrufen lasse und es in dieser probiere???

Dann hätte ich noch eine 2. Frage. Ist es vielleicht möglich einen Trigger zu einer bestimmten Zeit ausführen zu lassen und ihn nicht auf eine Tabelle zu legen?

Gruß
Bernd