bei "einem gesonderten Thread" fällt mir ein, sowohl hier als in meiner Antwort zum Beitrag von Steffen Pirsig - ich habe bisher wirklich nur an einem Thread in der Anwendung gedacht, den haben wir schon. Aber wenn alle Clients dies machen, dann könnten dies vielleicht zu einer Überlastung des Servers führen, also vermutlich müsste stattdessen doch ein separates, zentral läufendes Synchronisationsprogramm dafür her.
Das aber nur nebenbei - ich habe weiter über Deinen Vorschlag nachgedacht, vielleicht braucht man doch nur eine einzige Synchronisationstabelle so ähnlich wie folgt:
Code: Alles auswählen
CREATE TABLE Sync (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
angelegt timestamp NOT NULL DEFAULT current_timestamp,
uebernommen timestamp DEFAULT NULL,
fehlermeldung text DEFAULT NULL,
tabellenname text NOT NULL,
tabellenrecord integer NOT NULL,
rowversion integer NOT NULL,
feldnamen text[] NOT NULL,
feldwerte text[] NOT NULL,
CONSTRAINT arraysok CHECK (array_length(feldnamen, 1) = array_length(feldwerte, 1))
)
Wenn ein Konflikt trotzdem vorkommnt, kann sie zumindest durch einen Vergleich zwischen rowversion und __rowversion erkannt werden und in fehlermeldung zurückgemeldet. Weißt aber jemand eigentlich was __keyversion bedeutet?
So wie ich mir das vorstelle, wird tabellenrecord als 0 gelassen wenn ein Append gemacht werden soll, dann vom Synchronisationsprogramm mit RECNO() gefüllt.
Das Synchronisationsprogramm muss die Feldwerte von String in den jeweiligen Typ (entsprechend Feldname) konvertieren.
Ich glaube, der Rest sollte selbsterklärend sein.