-
Problem mit Triggern
Ich benötige euer Fachwissen bei folgender Aufgabestellung:
Beispiel:
Kundendaten von Mandant 1 sollen bei jeder änderung/neuanlage/löschung auch in Mandant 2 übertragen werden.
Mein erster Versuch war dies über einen externen RPG Trigger, der aufgrund der nötigen Rekursion mit ACTGRP(*new) erstellt wurde, zu realisieren. Im RPG Programm habe ich geprüft ob die Änderung aus Mandant 1 stammt um dann die Änderung auch in Mandant 2 zu übertragen.
Da ganze hat die Performance aber leider stark negativ beeinflusst. Ich vermute weil er ständig mit einer neuen Aktivierungsgruppe aufgerufen wurde und ich ja erst im Programm selbst prüfen kann ob die Änderung aus Mandant 1 oder 2 kommt was ja dann leider zu rekursiven Aufrufen führt.
Nun würde ich das Ganze gern mit einem SQL Trigger lösen, da ich bei diesem ja bereits bei der Definition bestimmen kann, dass es nur bei Änderungen in Mandant 1 aktiv werden soll.
Wie wird so ein Trigger denn nun am besten definiert?
Es muss ja bei einer Neuanlage oder Änderung im Prinzip nur der komplette Datensatz von Mandant 1 mit einem einzigen geänderten Feld (die Mandantennummer) in Mandant 2 angelegt werden.
Wenn ich das nun in etwa so umsetzen will:
Code:
CREATE TRIGGER TEST AFTER UPDATE ON KUNDENSTAMM
REFERENCING OLD OROW NEW NROW FOR EACH ROW MODE DB2ROW WHEN (OROW.MANDANT = '1')
BEGIN ATOMIC
DELETE FROM KUNDENSTAMM WHERE MANDANT = '2' AND KUNDE = OROW.KUNDE;
INSERT INTO KUNDENSTAMM (MANDANT, KUNDENNUMER,...... 100 weitere Felder) VALUES('2', NROW.KUNDENUMMER, ...... 100 weitere Felder);
END;
müsste ich ja alle meine Datenbankfelder angeben, was bei den Wartungsaufwand solcher Lösungen natürlich erhöht.
Wie geht man dann bei solch einer Anforderung am besten vor?
Danke für eure Hilfe!
-
Der SQL-Trigger wird da auch nicht performanter.
Definiere für deinen Trigger einfach eine benannte ACTGRP und beende das Programm mit *LR=*OFF.
-
Danke für die Antwort.
Dann bekomme ich allerdings einen RNX8888 wegen rekursivem Aufruf, da der Trigger sich ja wieder selbst aufruft, sobald er die Änderung in Mandant 2 schreibt.
-
Stimmt!
Bei SQL-Triggern musst du halt jedes Feld explizit benennen, da kommst du nicht drum herum.
-
seltsam, seltsam, was soll denn passieren, wenn ein Satz für Mandant 2 gelöscht, geändert, oder eingefügt wird? Für mich hört sich das nach einem krummen Datenbankdesign an, aber seis drum.
Wenn es nur darum geht für Mandant 2 immer die Sätze von Mandant 1 zu bekommen, dann tuts da schon eine View mit case.
Wenn man da schon unbedingt mit Triggern rumspielen will, dann sollte man beim update auch einen update machen und kein delete insert, das halbiert schon mal die Aufrufe auf die Hälfte.
Wenn man zu faul zum tippen ist und einem cut und paste noch zu mühsam ist, dann schreibt man sich halt einen Generator, wenn man da hunderte von Triggern braucht.
die Aufrufe für Mandant2 bekommt man auch mit einer View und einem instead Trigger weg, der dann aber wohl auch in SQL geschrieben werden muss.
D*B
 Zitat von marcel84
Ich benötige euer Fachwissen bei folgender Aufgabestellung:
Beispiel:
Kundendaten von Mandant 1 sollen bei jeder änderung/neuanlage/löschung auch in Mandant 2 übertragen werden.
Mein erster Versuch war dies über einen externen RPG Trigger, der aufgrund der nötigen Rekursion mit ACTGRP(*new) erstellt wurde, zu realisieren. Im RPG Programm habe ich geprüft ob die Änderung aus Mandant 1 stammt um dann die Änderung auch in Mandant 2 zu übertragen.
Da ganze hat die Performance aber leider stark negativ beeinflusst. Ich vermute weil er ständig mit einer neuen Aktivierungsgruppe aufgerufen wurde und ich ja erst im Programm selbst prüfen kann ob die Änderung aus Mandant 1 oder 2 kommt was ja dann leider zu rekursiven Aufrufen führt.
Nun würde ich das Ganze gern mit einem SQL Trigger lösen, da ich bei diesem ja bereits bei der Definition bestimmen kann, dass es nur bei Änderungen in Mandant 1 aktiv werden soll.
Wie wird so ein Trigger denn nun am besten definiert?
Es muss ja bei einer Neuanlage oder Änderung im Prinzip nur der komplette Datensatz von Mandant 1 mit einem einzigen geänderten Feld (die Mandantennummer) in Mandant 2 angelegt werden.
Wenn ich das nun in etwa so umsetzen will:
Code:
CREATE TRIGGER TEST AFTER UPDATE ON KUNDENSTAMM
REFERENCING OLD OROW NEW NROW FOR EACH ROW MODE DB2ROW WHEN (OROW.MANDANT = '1')
BEGIN ATOMIC
DELETE FROM KUNDENSTAMM WHERE MANDANT = '2' AND KUNDE = OROW.KUNDE;
INSERT INTO KUNDENSTAMM (MANDANT, KUNDENNUMER,...... 100 weitere Felder) VALUES('2', NROW.KUNDENUMMER, ...... 100 weitere Felder);
END;
müsste ich ja alle meine Datenbankfelder angeben, was bei den Wartungsaufwand solcher Lösungen natürlich erhöht.
Wie geht man dann bei solch einer Anforderung am besten vor?
Danke für eure Hilfe!
Similar Threads
-
By Stoeberl in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 10-01-07, 10:58
-
By Stoeberl in forum NEWSboard Programmierung
Antworten: 11
Letzter Beitrag: 26-10-06, 10:07
-
By ChrisX in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 11-10-06, 15:31
-
By Flappes in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 06-10-06, 08:39
-
By sim in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 10-05-06, 14:45
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks