Im vorletzen Entwickler Heft war ein Artikel von Holger Klemt zur Replikation.
Ich habe schon verschiedene Replikationen uni- und bidirektional programmiert.
Folgendes sollte man dabei berückichtigen:
1.) Wie schon erwähnt disjunkte Nummernkreise für die PKs
2.) Evtl. ebenso für die Kdnr
3.) Bei eindeutigen aufsteigenden lückenlosen Rechnungsnummersequenzen wirds noch kniffliger
4.) Konfliktmananagement:
-Was passiert wenn zwei Filialen einen Kundensatz gleichzeitig ändern
-FK Verletzungen z.B Filiale A löscht aus einer Lookuptabelle mit FK einen Datensatz, und Filiale B erzeugt einen
neuen Kundensatz der gerade diese Datensatz aus der Lookuptabelle verwendet und will diesen an Filiale a schicken
5.) Replikation auf Feld- oder Datensatzebene
6.) Du hast von temp. Tabellen gesprochen so was ähnliches brauchst du auch für das Logging der Änderungen.
7.) Replikationsengine als Dienst oder App
8.) Replikationsmodell: Filiale A <-> Filiale B <-> Filiale C oder eine Zentrale die alle Filialen bedient
Ein Ansatz wäre folgender:
In AI,AU und AD Triggern der zu replizierenden Tabellen werden die Aenderungen in der Log Tabelle protokoliiert und
diese Log Tabelle muss dann an die anderen Clients weitergereicht werden.
Damit beim Replizieren die Aenderungen nicht wieder durch die Trigger in die Log Tabelle kommen arbeitet der Replikationsdienst am besten mit einer eigenen Userkennung die man dann in den Triggern abfragen kann.
Ein typischer Firebird Trigger sähe etwa so aus:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| CREATE TRIGGER IBE$ECC_CUSTOMER_AI FOR ECC_CUSTOMER ACTIVE AFTER INSERT POSITION 32000 AS BEGIN IF ((GEN_ID(REPLIKATION_ON, 0) = 1) AND (USER <> 'REPLICAT')) THEN INSERT INTO REP_LOG (RL_TABLE_NAME, RL_TABLE_ID, RL_EVENT_TYPE,RL_TIMESTAMP, RL_ID_FIELD) VALUES('ECC_CUSTOMER', NEW.ID, 'I',CURRENT_TIMESTAMP,'ID'); END |
Der Trigger schlägt also nur zu wenn der Generator REPLIKATION_ON (Schalter an/aus der Replikation) 1 ist und der Insert nicht vom User REPLICAR stammt. Dann wird ein Eintrag in der RepLog Tabelle gemacht, die später dann durch den Replikationsdienst abgearbeitet wird.
Schau dir mal bei IBexpert den LogManager an, der kann einem beim Erstellen der Trigger helfen. Ebenso kann man die Schablonen bei IBExpert individuell gestalten.
Gruss
DD