PDA

View Full Version : Trigger before insert



Juergen
08-08-19, 09:48
Hallo zusammen,

ich habe hier den Fall, dass ein RPG WRITE bei einer Datei , bei der ein *BEFORE *INSERT Trigger hinterlegt ist, durchgeführt werden soll.

Schlägt jetzt das WRITE fehl (Fehlerbezugszahl ist an), wird trotzdem der Trigger aufgerufen.

Ist das so per Design gewollt oder ist das ein Problem, was gefixt werden muss?

Grüße
Jürgen

B.Hauser
08-08-19, 10:05
Ein BEFORE INSERT Trigger wird aktiviert, BEVOR der Satz geschrieben wird.
Wenn also Dein WRITE aufschlägt ist der Trigger bereits ausgeführt worden.

Wenn der Trigger erst nachdem Dein Satz ordnungsgemäß eingefügt wurde aktiviert werden soll, hätte ein AFTER INSERT Trigger erstellt werden müssen.

Birgitta

Fuerchau
08-08-19, 10:05
Ja, das ist generell ein Problem, dass ein Before-Trigger aufgerufen wird, bevor die Constraints wie Unique-Key geprüft werden.
Da man den After-Insert-Buffer ja (falls erlaubt) ändern kann, hat man u.U. die Gelegenheit, fehlende Daten zu ergänzen. Wenn man ein Protokoll schreibt hat dies gewisse Vorteile, da man dort auch Versuche protokollieren kann.
Bei Commitsteuerung sieht es etwas anders aus, da dann der Aufrufer im Fehlerfall einen Rollback durchführen kann.
Ist die Protokolldatei journalisiert und läuft der Trigger und das Protokoll unter Commit, wird auch diese Änderung rükgängig gemacht.

Willst du den After-Insert-Buffer nicht ändern sondern nur andere Tabellen mit ändern, so führe einen After-Insert-Trigger aus. Dann werden erst die Constraints geprüft bevor der Trigger aufgerufen wird.
Du kannst dann allerdings keine Daten des aktuellen Satzes mehr ändern.
Vorsicht ist dann auch unter Commitsteuerung mit ggf. einer eigenen ACTGRP, denn dann kann man beim Zugriff auf denselben Satz Deadlock (mit Satztimeot) provozieren.

Juergen
08-08-19, 10:26
Oje,

Danke für die Info.

ich hatte angenommen, dass der before trigger aufgerufen wird, nachdem die Constraints durch sind und bevor dann wirklich geschrieben oder geupdated wird.

Dann gilt das wohl auch für die before trigger von update und delete.

Jürgen

Fuerchau
08-08-19, 11:57
Das ist korrekt.
Deshalb unterstützt z.B. der Microsoft SQL-Server keine Before-Trigger sondern ausschließlich After-Trigger (wobei diese auch nicht je Satz sondern je Operation aufgerufen werden).

Möchte man da einen Before-Trigger, muss man dies als Instead-Of-Trigger lösen (gibts bei DB2 auch).
Dies ist dann in so weit logischer, als dass der Trigger aufgerufen und gar keine DB-Operationen durchgeführt werden. Diese müssen nämlich dann im Trigger selber gemacht werden.

Vorteil (je nach Ansicht) von Instead-Of ist, dass man da einen Trigger auf Views und Joins legen kann so dass der Trigger die Verteilung in die Tabellen übernimmt.