Umschreiben eines MSSQL Triggers zu einem DB2 Trigger

Klopfdreh

Mitglied
Hallo zusammen,

ich stehe gerade vor einer Herausforderung. Undzwar soll ich einen MSSQL Trigger in einen DB2 Trigger konvertieren.

Hier der MSSQL Trigger
PHP:
USE [database]
GO
/****** Object:  Trigger [dbo].[triAKTMKM]    Script Date: 09/25/2012 13:18:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[triAKTMKM] ON [dbo].[AKTMKM] 
FOR INSERT, UPDATE
AS
set nocount on
Update AKTMKM 
Set AKTMKM.Vorlage=AKT.Vorlage,AKTMKM.Erledigt=AKT.erledigt,AKTMKM.Datum=AKT.Datum,AKTMKM.Datum_bis=AKT.datum_bis

From aktmkm inner join inserted on aktmkm.dsn=inserted.dsn inner join akt on inserted.link_dsn= akt.dsn

Und nun meine ersten Schritte für die DB2 Trigger, da man ja leider einen DB2 Trigger nur an ein Event binden kann:
PHP:
CREATE TRIGGER AKTMKMInsert 
NO CASCADE BEFORE INSERT ON DBO.AKTMKM
REFERENCING NEW as INSERTED
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE xVORLAGE TIMESTAMP;
DECLARE xDATUM_BIS TIMESTAMP;
DECLARE xDATUM TIMESTAMP;
DECLARE xERLEDIGT SMALLINT;
SET (xVORLAGE,xDATUM_BIS,xDATUM,xERLEDIGT) = (SELECT AKT.VORLAGE,AKT.DATUM_BIS,AKT.DATUM, AKT.ERLEDIGT FROM DBO.AKT AKT,DBO.AKTMKM AKTMKM WHERE AKT.DSN = INSERTED.LINK_DSN AND AKTMKM.DSN=INSERTED.DSN);
UPDATE DBO.AKTMKM SET VORLAGE=xVORLAGE,ERLEDIGT=xERLEDIGT,DATUM=xDATUM,DATUM_BIS=xDATUM_BIS WHERE DBO.AKTMKM.DSN=INSERTED.DSN;
END @

CREATE TRIGGER AKTMKMUpdate
NO CASCADE BEFORE UPDATE ON DBO.AKTMKM
REFERENCING NEW as INSERTED
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE xVORLAGE TIMESTAMP;
DECLARE xDATUM_BIS TIMESTAMP;
DECLARE xDATUM TIMESTAMP;
DECLARE xERLEDIGT SMALLINT;
SET (xVORLAGE,xDATUM_BIS,xDATUM,xERLEDIGT) = (SELECT AKT.VORLAGE,AKT.DATUM_BIS,AKT.DATUM, AKT.ERLEDIGT FROM DBO.AKT AKT,DBO.AKTMKM AKTMKM WHERE AKT.DSN = INSERTED.LINK_DSN AND AKTMKM.DSN=INSERTED.DSN);
UPDATE DBO.AKTMKM SET VORLAGE=xVORLAGE,ERLEDIGT=xERLEDIGT,DATUM=xDATUM,DATUM_BIS=xDATUM_BIS WHERE DBO.AKTMKM.DSN=INSERTED.DSN;
END @

Sowie ich in der Dokumentation gelesen habe ist ein FOR Trigger bei MSSQL ein BEFORE Trigger bei DB2. Des weiteren kann ich FROM bei einem Update nicht verwenden, weshalb ich eine Lösung über die Variablen angestrebt habe. NO CASCADE verhindert eine Trigger-Rekursion.

Wo die Trigger sich unterscheiden ist, dass ich bei einem BEFORE-Trigger bei DB2 kein NEW TABLE verwenden kann, weshalb ich nur NEW verwendet habe, da der MSSQL Trigger so aufgebaut ist, dass nur der eine NEW-Datensatz ermittelt wird.

Dennoch scheinen Sie sich noch sehr zu unterscheiden, da eine unterschiedliche Funktionsweise in der Anwendung festgestellt werden kann.

Hat da irgendwer eine Idee?

Danke für die Hilfe im Voraus!
 
The trigger where absolutly right - there was another trigger that plays a little bit ping pong with these both. Here are the final trigger.

The only things I changed is to let the triggers be executed after the insert and with the if condition I prevent recursive calls:

PHP:
CREATE TRIGGER AKTMKMInsert 
AFTER INSERT ON DBO.AKTMKM
REFERENCING NEW as INSERTED
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE xVORLAGE TIMESTAMP;
DECLARE xDATUM_BIS TIMESTAMP;
DECLARE xDATUM TIMESTAMP;
DECLARE xERLEDIGT SMALLINT;
SET (xVORLAGE,xDATUM_BIS,xDATUM,xERLEDIGT) = (SELECT AKT.VORLAGE,AKT.DATUM_BIS,AKT.DATUM,AKT.ERLEDIGT FROM DBO.AKT AKT,DBO.AKTMKM AKTMKM WHERE AKT.DSN=INSERTED.LINK_DSN AND AKTMKM.DSN=INSERTED.DSN);
	IF (xVORLAGE <> INSERTED.VORLAGE OR xDATUM_BIS <> INSERTED.DATUM_BIS OR xDATUM <> INSERTED.DATUM OR xERLEDIGT <> INSERTED.ERLEDIGT) THEN
		UPDATE DBO.AKTMKM SET VORLAGE=xVORLAGE,ERLEDIGT=xERLEDIGT,DATUM=xDATUM,DATUM_BIS=xDATUM_BIS WHERE DBO.AKTMKM.DSN=INSERTED.DSN;
	END IF;
END @

CREATE TRIGGER AKTMKMUpdate
AFTER UPDATE ON DBO.AKTMKM
REFERENCING NEW as INSERTED
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE xVORLAGE TIMESTAMP;
DECLARE xDATUM_BIS TIMESTAMP;
DECLARE xDATUM TIMESTAMP;
DECLARE xERLEDIGT SMALLINT;
SET (xVORLAGE,xDATUM_BIS,xDATUM,xERLEDIGT) = (SELECT AKT.VORLAGE,AKT.DATUM_BIS,AKT.DATUM,AKT.ERLEDIGT FROM DBO.AKT AKT,DBO.AKTMKM AKTMKM WHERE AKT.DSN=INSERTED.LINK_DSN AND AKTMKM.DSN=INSERTED.DSN);
	IF (xVORLAGE <> INSERTED.VORLAGE OR xDATUM_BIS <> INSERTED.DATUM_BIS OR xDATUM <> INSERTED.DATUM OR xERLEDIGT <> INSERTED.ERLEDIGT) THEN
		UPDATE DBO.AKTMKM SET VORLAGE=xVORLAGE,ERLEDIGT=xERLEDIGT,DATUM=xDATUM,DATUM_BIS=xDATUM_BIS WHERE DBO.AKTMKM.DSN=INSERTED.DSN;
	END IF;
END @
 

Neue Beiträge

Zurück