PDA

View Full Version : SQL Trigger insert - einfacher?



rebe
29-04-10, 16:13
Hallo,

ich möchte einen SQL Trigger für insert einfacher schreiben, wenn möglich.

Datei test90: Felder f1, f2
Datei test91: Felder f1, f2

create trigger test90i after insert
on test90
REFERENCING NEW ROW AS NROW
for each row mode db2row
begin insert into test91 (f1, f2)
values(nrow.f1, nrow.f2); end
--------------------------------------
Kann ich das auch variabel halten?
In diesem Beispiel gebe ich die Felder und Values explizit an. Wenn ich 100 Felder habe, wird das aufwendig und muss bei einer Datenbankänderung (neues Feld) angepasst werden.

Geht das auch variabel etwa so:
begin insert into test91 select * from nrow; end

Da kommt die Fehlermeldung: file nrow nicht gefunden.
Hat jemand eine Idee?

Danke eure Hilfe!

Grüße
rebe

Fuerchau
29-04-10, 17:27
Nein, da hast du schlechte Karten.
Das ist ja gerade Sinn und Zweck, dass der Compiler die Auflösung betreibt und dann sind die SQL's statisch.
Eine Änderung der Tabelle hat dann keine Auswirkungen auf den Trigger, wenn du den Trigger nicht anpasst.

Was du machen kannst, die Quelle per Programm zu generieren und dann per Execute zur Ausführung bringst.

Die "Select *"-Variante funktioniert nur bei den Precompilern für HLL-Sprachen (RPG/COBOL).

B.Hauser
30-04-10, 10:00
Hallo,

Ich hab's nicht ausprobiert, aber zwei Ideen:
1. Versuche mal den Insert wie folgt:

Insert into MyTable Values(NRow.*);
oder

Insert into MTable 1 row values (NRow.*);


2. Wenn Du den Trigger mit For Each Statement (anstatt for Each Row) definierst solltest Du ein Select-Statement ausführen können. Damit könntest Du auch gleich mehrere in die erste Datei eingefügte Datensätze auf einen Schlag in die nächste Datei schreiben.


Create Trigger MySchema/MyTrigger
After Insert on MyTable
Referencing NEW_TABLE as NRows
Begin Atomic
Insert Into MySchema/NextTable
Select * from NRows;
End;


Birgitta

rebe
04-05-10, 09:11
Hallo,

das Statement unter "2. Create Trigger" funktioniert so.

Was bedeutet in diesem Zusammenhang das Wort "Atomic"?

Grüße
rebe

BenderD
04-05-10, 10:01
atomic legt fest, was bei einer nicht behandelten Exception innerhalb des Blocks passieren soll, nämlich ein Rollback.

Falls du diesen Ansatz für deine Datenreplikation nehmen willst, wird es immer schräger.

Zum erlauben von Lesezugriffen macht man keine Replikate, das ist ein ernsthafter Design Fehler.

Replikate macht man nicht mit Triggern, sondern über das Journal.

Nochmal unvorteilhaft ist es zu diesem Zweck den Buffer nochmal lesen zu wollen, den kriegt der Trigger schon.

Uniforme Trigger, die man für alle Tabellen haben will, generiert man, dann gibt es auch das vermeintliche * Problem nicht.

D*B,
der sich wundert wieviel Zeit manche Leute für eine Aufgabenstellung bekommen.


Hallo,

das Statement unter "2. Create Trigger" funktioniert so.

Was bedeutet in diesem Zusammenhang das Wort "Atomic"?

Grüße
rebe