Tabellensynchronisierung unidirektional

Hallo,

ich will mal kurz die Problemstellung beschreiben und dann die zwei Möglichkeiten beschreiben, die ich als Lösung sehe.

Ich habe zwei Datenbanken DB1 und DB2. Die können auf unterschiedlichen Rechnern liegen, müssen aber nicht. Die DB1 stellt eine Tabelle bereit, in der Nutzerdaten (Name, Vorname, Personalnummer, usw.) eingetragen werden. Sobald eine Änderung in DB1 geschieht, soll der Datensatz in die DB2 synchronisiert werden. Dabei müssen Teile der Daten im Eintrag in die Einzeltabelle von DB1 in unterschiedliche, mehrere Tabellen von DB2 befördert werden. Es gibt also etwas Logik, die man beim Eintrag in DB2 umsetzen muss. Dieser Vorgang soll automatisiert werden.

Hintergrund ist die Bereitstellung einer Art Schnittstellen-DB (DB1), in die ein Kooperationspartner per ODBC etwas eintragen kann, während er auf die DB der Hauptanwendung (DB2) keinen Zugriff erhält.

Bemerkung: Es wird nur uni-direktional synchronisert, also DB1 --> DB2.

Lösung 1: Ich schreibe Triggerfunktionen in der DB1, die bei INSERT, UPDATE oder DELETE den Eintrag hernehmen und unter Anwendung der Logik in die DB2 synchronisieren.

Frage: Kann man Trigger Datenbank-Übergreifend machen, etwa mit PL/PGSQL? In den Beispielen finde ich immer nur Trigger, die auf einer und derselben DB arbeiten.

Lösung 2: Ich schreibe mir einen Service in Java, der zwei JDBC-Verbindungen zu DB1 und DB2 aufbaut und die Logik abbildet. Dabei guckt der Service zyklisch alle paar Sekunden, ob sich in DB1 etwas geändert hat.

Mir ist Lösung 2 fast lieber, weil ich da ungefähr weiß, wie ich ansetzen muss. Aber ich hab das “Gefühl”, dass man das eigentlich ganz anders machen könnte…

Gibt es da Ideen dazu?

Viele Grüße,
ferdy

Hast du dir schon mal Slony (Homepage) angeschaut?

Danke für deine Antwort.

Ja, ich kenne Slony-I und wir haben es auch schon eingesetzt um teilweise identische Datenbankstrukturen in zwei unterschiedlichen Datenbanken zu synchronisieren.

Gegen den Einsatz bei dem hier genannten Problem spricht zum Beispiel dieser Satz aus der Dokumentation:

“Slony-I is a complex multi-client, multi-server system, with the result that there are almost an innumerable set of places where problems can arise.”

Ausserdem repliziert man ja komplette Tabellen damit, soweit ich weiss. ich denke, dass Slony hier einfach ein bisschen zu komplex ist und gleichzeitig zu grob.

Dann wirst du wohl um etwas spezielles nicht herumkommen.

PL/Java haette dazu interessante Ansaetze

z.B. könntest du in einer PL/Java funktion auf einer Verbindung in einer andere DB operieren - außerdem soll man in PL/Java auf Transaktion (begin/end) einen listener setzen koennen - so kannst du in abhaengigkeit von geglückter oder misglueckter synch. die transaktion abbrechen …

Ok ich verrate mal soviel - das mit den Transaktionen ist etwas hakelig - und PL/Java braucht viele Streicheleinheiten … aber es lohnt sich damit mal zu experimentieren.

Ich kann mir gut vorstellen, dass ein andere Language-handler aehliche Fähigkeiten bietet (so krimskrams mit Transaktionen) - weiss es aber nicht genau - weil ich mir bisher nur PL/Java angeschaut habe.

Diese Java-Funktion kannst du dann als Triggerfunktion erstellen und verwenden.

So zumindest die Theorie :slight_smile:

Ich denke, ich schreibe einen kleinen Java-Daemon. (Mal sehen, wie klein der bleibt.)

das ist wahrscheinlich der weg der am schnellsten zu einem ergebnis fuehrt …

dazu solltest du dir LISTEN und NOTIFY anschauen - gehoert zum PostgreSQL funktionsumfang … koennt nuetzlich sein

meine anregung galt eher dem geneigten “entdecker” :slight_smile: wie ich schon sagte - die PL/Java funktioniert ganz gut - ist aber auch an einigen stellen etwas hakelig … wenn man damit keine erfahrung hat wird man schon mal auf dö gosch fallen - es lohnt sich aber das mal anzuschauen.

ich suche nun schon seit längerer zeit nach einer ähnlichen lösung und wollte hier fragen ob sich seit dem letzten post schon neue möglichkeiten aufgetan haben und dieses Problem leichter zu lösen.

konkret muss ich in meinem fall einzelne Tabellen von 2 Datenbanken (beide DBs auf gleichem Server mit gleicher Tabellen-Struktur) synchron halten. würde dies am liebsten ohne JAVA logik umsetzen.

wie mache ich das mit postgre am einfachsten?