Autor Beitrag
dirkil2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Sa 27.11.04 17:05 
Ich möchte folg. machen: Meine Applikation speichert Daten in lokalen Interbase Tabellen. Von Zeit zu Zeit ist es nötig, dass sich die Nutzer meiner App mit dem Internet verbinden und eine Server Tabelle mit einer lokalen Tabelle zu synchronisieren.

Zur Umsetzung habe ich mir folg überlegt:
Ich muss alle Änderungen (INSERT, UPDATE and DELETE) für die lokale Interbase Tabelle mitprotokollieren. Ich nehme an, das macht man am besten mit Triggern. Sprich, ich brauche 3 Trigger: einen für INSERT, einen für UPDATE und einen für DELETE Statements.

Was sollte ich loggen? Komplette SQL Statements mit Timestamp, die ich dann ggf. in der richtigen Reihenfolge gegen die Server Datenbank ausführen kann, um diese zu synchronisieren?

Oder stellt der Interbase Server für das Protokollieren von Änderungen schon etwas Vorgefertigtes zur Verfügung?

Wie würdet Ihr das machen?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 29.11.04 12:18 
Hallo!

Wie wäre es mit einer Tabelle "Replog", in der du dann dementsprechend einträgst, welcher Datensatz verändert oder neu angelegt wurde?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
create table Replog
(
  ID integer not null primary key, /* eindeutige ID des Replog-Eintrages */
  OP char, /* 'I','U' oder 'D' */
  Dataset_ID integer not null /* Schlüssel zum Datensatz der Tabelle */
);


Wenn sich ein Client synchronisiert, muß dieser alle Replog-Einträge seit der letzten Synchronisation einbeziehen und dieses Replog abarbeiten.

Dabei gibt es natürlich noch ein paar Fallstricke, z.B. wenn ein Teil der Serverdaten erst später commited wird als ein anderer, sodaß es nicht ausreicht, sich auf Clientseite die höchste jemals verarbeitete Replog_ID zu merken...

Cu,
Udontknow
dirkil2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Mo 29.11.04 13:07 
@Udontknow

Ich denke, das funktioniert zwar, aber man macht beim Synchronisieren Sachen u.U. doppelt.

Zu Beginn steht folg. in der Datenbank:

ID Wert
A 17

Jetzt kommt ein Update:
ID Wert
A 20

Dies führt zum Replog-Eintrag:

ID Op Dataset_ID
1 U A

Jetzt kommt noch ein Update:
ID Wert
A 99

ID Op Dataset_ID
1 U A
2 U A

Beim Synchronisieren würde man jetzt zwei Mal das gleiche Update ausführen. Oder habe ich das Verfahren falsch verstanden?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 29.11.04 13:45 
Nun, dann merke dir eben die Datensätze, die du bereits beim Synchronisieren abgearbeitet hast, ein zweites Update solltest du dann einfach ignorieren. Genauso dann natürlich auch Inserts und Updates, zu denen es gar keinen Inhaltsdatensatz mehr gibt (weil sie bereits gelöscht wurden und dementsprechend ein D folgt).

BTW: Sobald ein D kommt, könnte man auch alle vorherigen Replog-Einträge des Datensatzes entfernen.

Cu,
Udontknow