Hallo zusammen,
ich stehe gerade vor einer Herausforderung. Undzwar soll ich einen MSSQL Trigger in einen DB2 Trigger konvertieren.
Hier der MSSQL Trigger
Und nun meine ersten Schritte für die DB2 Trigger, da man ja leider einen DB2 Trigger nur an ein Event binden kann:
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!
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!