PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Insert Trigger Problem



Stefan Feeser
25-01-2002, 15:10
Hallo zusammen,

ich arbeite mit einem IDS (Informix Dynamic Server) in der Version 7.27. Hier möchte ich sicherstellen, dass bei einem eingefügten Tupel der Identifier dieses Tupels abgegriffen wird und in einer zweiten Tabelle dieser ebenfalls eingefügt wird. Dadurch möchte ich sicherstellen, dass die Referenzattribute in beiden Tabellen zu jeder Zeit identisch sind, ich also im ungünstigsten Fall für einen zweiten Identifier keine Informationen bekomme - ich weiss, eigentlich hätte man bei identischen Tabellen vom Design her die Attribute der zweiten Tabelle in der ersten integrieren müssen, ging aber hier halt nicht...

Kurz das Statement zum Erstellen des Triggers müßte wie folgt aussehen:

CREATE TRIGGER insertsicher
INSERT ON triggertest1
REFERENCING NEW AS neu
FOR EACH ROW
(INSERT INTO triggertest2(id)
VALUES (neu.id));

Das Problem ist hier jetzt nur, dass der Server beim Einfügen das
ja für jede Zeile macht, wenn ich aber hingegen etwa AFTER statt FOR EACH ROW verwende, kann ich das REFERENCING nicht verwenden.

Hat jemand da ne Idee wie das funktionukkeln könnte?

Gruß und Danke

Stefan

Martin Ament
25-01-2002, 18:42
Hi,

bin zwar von der Oracle Seite, aber vielleicht hilft es dennoch.
WEnn ich Dein Problem richtig verstehe, dann willst du nicht, dass bei jedem insert der Trigger zündet ?

Kenne wie gesagt IDS nicht, aber unter Oracle würde ich das mit einem Cursor lösen.

Ich würde das Ganze in einen Cursor schreiben, und dann als Array absetzen. BZW in deinem Fall dann eben zweimal.

Martin

Stefan Feeser
26-01-2002, 17:14
Hi,

doch, doch - das neue Ereignis soll bei jedem INSERT ausgelöst werden! Wenn ich aber das so wie oben lasse fügt der Trigger für alle vorhandenen Datensätze einen Tupel in der zweiten Tabelle ein. Bei einem Datensatz in Tabelle 1 funktioniert es also wie gewollt, sobald ich aber 2 oder mehr drin habe macht das Statement die Aktion 2 und mehr mal...

Stefan

Martin Ament
28-01-2002, 11:46
wenn du das über eine cursorprozedur machst, dann schreibst du das ja nicht in die Tabelle direkt, sondern löst diese Prozedur aus, und die schreibt das dann in die entsprechenden tabellen weg.

und das wegschreiben kann in eine Tabelle, oder auch in mehrere sein. Identifiziert werden die Datensätze über den Primk

martin

Stefan Feeser
28-01-2002, 13:25
Mahlzeit,

danke für den Tip. Könntest Du aber nochmal ein Beispiel posten, da ich das mit den Cursorn bisher nur mal gehört habe, mir das aber nicht so ganz klar ist (Tigger und Stored Procedures kenn ich).

Gruß und Danke

Martin Ament
28-01-2002, 17:53
Entweder eine stored procedure, deren in parameter die in die datenbank einzufügenden werte sind, dann kann man innerhalb der prozedur 2 inserts absenden,und gleichzeitig evtl. logging erledigen.

oder wenn das insert auf einem anderem select beruht, dann eben innerhalb der prozedur:

// so geht das zumindest in Oracle

for cur_tmp in (select x, y, z from table where z=y) loop
insert into table a, b, c values (cur_tmp.x, cur_tmp.y, cur_tmp.z)
end loop

In anderen Sprachen nennt man das array. so etwas kann man auch über php oder ähnlich Sprachen lösen. der Cursor ist auch nur ein pl/sql - Element von Oracle.

Martin

Stefan Feeser
29-01-2002, 12:36
Danke

werd es testen!

Noch ne schöne Woche

Stefan