Discussion:
Access mit MySQL synchronisieren
(zu alt für eine Antwort)
Ralf Rimmerg
2005-07-05 18:34:29 UTC
Permalink
Es gibt eine Access Datenbank mit verschiedenen Tabellen, die in Beziehung
zueinander stehen.
Online wird eine MySQL-Datenbank mit PHP arbeiten. Die Onlinedaten sollen
regelmäßig in die Access-Datenbank
aufgenommen werden.

Es ist eine Adressliste von einem Verein. Bei einer Veranstaltung können
sich Teilnehmer online
eintragen. Diese Daten sind zum Teil schon in der Accessdatenbank vorhanden,
weil sich zum Beispiel
ein Vereinsmitglied anmeldet.
Nun soll der Hauptstamm (Access) mit den Offlinedaten synchronisiert werden.
Dies soll ca. 1x die Woche, oder sogar 1x am Tag erfolgen.

Wie kann man soetwas realisieren?

Meine Gedanken:
Man exportiert alle MySQL Daten in eine Accessdatenbank, welche den gleichen
Aufbau hat, wie die Hauptdatenbank.
Dann führt man eine Synchronisierung durch. Das wäre mein Traum.

Funktioniert ein solches Konstrukt?
Berücksichtigt ACCESS dabei die Beziehungen?

Oder gibt es einen besseren Weg?

Komprimierte Struktur der Datenbank: Haupttabelle->
AdressID (primary Key)
Plz
Ort
Name
Vorname

Nebentabellen wie zum Beispiel Anmeldung für Veranstaltung (es gibt immer
nur eine Veranstaltung)
AdressID (fremder Schlüssel)
Datum der Anmeldung
Wieviel Personen
Name der Gäste

Die Teilnehmer identifizieren sich mit Name, Vorname, Plz, Ort.
->Klar mit der Kennnummer wäre es am Besten... <- Geht aber (noch) nicht

Die Aufgabe der Synchronisierung ist alle gesammelten Onlinedaten in die
Haupttabelle/Nebentabelle zu übernehmen.
Danach werden die Onlinedaten gelöscht und es wird mit der Access weiter
gearbeitet. 5 Tage später gibt es dann wieder
neue Anmeldungen. usw.

Wie kann man soetwas lösen?
Henry Habermacher [MVP Access]
2005-07-06 02:07:28 UTC
Permalink
Hallo Ralf
Post by Ralf Rimmerg
Es gibt eine Access Datenbank mit verschiedenen Tabellen, die in
Beziehung zueinander stehen.
Online wird eine MySQL-Datenbank mit PHP arbeiten. Die Onlinedaten
sollen regelmäßig in die Access-Datenbank
aufgenommen werden.
Es ist eine Adressliste von einem Verein. Bei einer Veranstaltung
können sich Teilnehmer online
eintragen. Diese Daten sind zum Teil schon in der Accessdatenbank
vorhanden, weil sich zum Beispiel
ein Vereinsmitglied anmeldet.
Nun soll der Hauptstamm (Access) mit den Offlinedaten synchronisiert
werden. Dies soll ca. 1x die Woche, oder sogar 1x am Tag erfolgen.
Wie kann man soetwas realisieren?
Mein erster Gedanke wäre, die Tabellen von MySQL in die Access Anwendung
einzubinden und dann ebenfalls auf dem gleichen Datenbestand laufen zu
lassen, also ganz auf die MDB für diese Tabellen zu verzichten. Dann sparst
Du Dir die Synchronisation.

Falls das nicht geht (MySQL nicht immer im Zugriff), dann wird das nur mit
händisch programmierter Synchronisation möglich sein. Zudem wirst Du dann
sicherstellen müssen, dass die Synchronisationskonflikte auch behoben
werden.
Abhängig von der MySQL Version kannst Du dafür auch Trigger verwenden, die
in MySQL bei jedem Insert/Update/Delete anlaufen und die Datenänderungen in
eine Synchronisationstabelle eintragen. Dabei kannst Du in dieser
Synchronisationstabelle z.B. folgende Information wegschreiben:
- SynchID
- Tabellenname
- PKFeldName
- PKWert
- Aktion

SynchID enthält einen aufsteigenden Wert der Synchronisationseinträge
Tabellenname enthält den Namen der Tabelle, in der die Daten geändert wurden
PKFeldname enthält den Namen des PrimaryKey Feldes der Tabelle
PKWert enthält den Wert des PrimaryKeys
Aktion enthält I(NSERT), U(PDATE) oder D(ELETE)

Nun kannst Du die Synchronisationstabelle in Access importieren oder
einlinken, was immer einfacher geht und dann Schritt für Schritt abarbeiten.
Die Originaldaten der MySQL Datenbank hast Du ja ebenfalls im Zugriff
(entweder als Import oder gelinkt) und kannst nun einfach folgendes machen:

Falls Insert:
Datensatz aus MySQL Tabelle in MDB Tabelle kopieren

Falls Update:
Datensatz in MDB gemäss DAtensatz in MySQL updaten. Evt. kannst Du diesen
vorher auch löschen und dann neu einfügen, müsstest Du aber in einer
einzigen Transaktion machen, damit Du kurzzeitig inkonsistent sein kannst,
weil Du sonst u.U. die Referentielle Integrität verletzt. Falls nicht,
kannst Du per VBA Recordset generisch ein Update Statement erzeugen, indem
Du die Feldinhalte der MySQL Tabelle mit der der MDB Tabelle abgleichst und
daraus das SQL Statement erzeugst, das Du für den Update benötigst.

Falls Delete:
Datensatz auch in der MDB löschen.

Damit sollte eine Einweg-Synchronisation ziemlich gut realisierbar sein.
Dies bedingt allerdings, dass Du die Daten in der MDB nicht auch noch
änderst, sonst musst Du die Synchronisation in beide Richtungen laufen
lassen, was erheblich komplizierter sein dürfte.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Ralf Rimmerg
2005-07-06 07:41:18 UTC
Permalink
Post by Henry Habermacher [MVP Access]
Mein erster Gedanke wäre, die Tabellen von MySQL in die Access Anwendung
einzubinden und dann ebenfalls auf dem gleichen Datenbestand laufen zu
lassen, also ganz auf die MDB für diese Tabellen zu verzichten. Dann
sparst Du Dir die Synchronisation.
Falls das nicht geht (MySQL nicht immer im Zugriff), dann wird das nur mit
händisch programmierter Synchronisation möglich sein. Zudem wirst Du dann
sicherstellen müssen, dass die Synchronisationskonflikte auch behoben
werden.
Abhängig von der MySQL Version kannst Du dafür auch Trigger verwenden, die
in MySQL bei jedem Insert/Update/Delete anlaufen und die Datenänderungen
in eine Synchronisationstabelle eintragen. Dabei kannst Du in dieser
- SynchID
- Tabellenname
- PKFeldName
- PKWert
- Aktion
SynchID enthält einen aufsteigenden Wert der Synchronisationseinträge
Tabellenname enthält den Namen der Tabelle, in der die Daten geändert wurden
PKFeldname enthält den Namen des PrimaryKey Feldes der Tabelle
PKWert enthält den Wert des PrimaryKeys
Aktion enthält I(NSERT), U(PDATE) oder D(ELETE)
Nun kannst Du die Synchronisationstabelle in Access importieren oder
einlinken, was immer einfacher geht und dann Schritt für Schritt
abarbeiten. Die Originaldaten der MySQL Datenbank hast Du ja ebenfalls im
Zugriff (entweder als Import oder gelinkt) und kannst nun einfach
Datensatz aus MySQL Tabelle in MDB Tabelle kopieren
Datensatz in MDB gemäss DAtensatz in MySQL updaten. Evt. kannst Du diesen
vorher auch löschen und dann neu einfügen, müsstest Du aber in einer
einzigen Transaktion machen, damit Du kurzzeitig inkonsistent sein kannst,
weil Du sonst u.U. die Referentielle Integrität verletzt. Falls nicht,
kannst Du per VBA Recordset generisch ein Update Statement erzeugen, indem
Du die Feldinhalte der MySQL Tabelle mit der der MDB Tabelle abgleichst
und daraus das SQL Statement erzeugst, das Du für den Update benötigst.
Datensatz auch in der MDB löschen.
Damit sollte eine Einweg-Synchronisation ziemlich gut realisierbar sein.
Dies bedingt allerdings, dass Du die Daten in der MDB nicht auch noch
änderst, sonst musst Du die Synchronisation in beide Richtungen laufen
lassen, was erheblich komplizierter sein dürfte.
Gruss
Henry
Danke für deine Antwort. Die SyncTabelle ist nicht notwendig, da jeder
Datensatz in der MySQL Datenbank liegt eine „Veränderung“ darstellt.
Denn nach jedem Sync. Wird die MySQL Tabelle geleert/gelöscht.
Wie importiere ich am Besten die Daten?....
... habe grad den ODBC Treiber getestet. Scheint zu funktionieren.

Hmm. Sollte das die Lösung sein? Da ist dann aber noch viel zu
Programmieren...
Vielen Dank erst einmal.

Ich werde es zur Zeit wie folgt machen:
MySQL per ODBC importieren.
Es wird eine Übersicht der Neueinträge angezeigt. Wenn man einen anklickt,
werden alle vorhandenen Einträge
daneben angezeigt (z.B. alle, die auch Meyer heißen und in Hannover wohnen).
Dann kann man auswählen, ob
diese Person schon in der DB vorhanden ist oder ob es tatsächlich ein
Neueintrag ist.
Dann erfolgt (UPDATE|INSERT).
<- Überlege noch, ob man durch einfaches anklicken der Felder Veränderungen
übernehmen kann...
Danach werden in anderen Tabellen verknüpfte Daten aktualisiert...(mit der
neuen/vorhandenen ID)
Das ganze mit VBScript.

Hat jemand noch einen Tipp, um das zu erleichtern?
<- Habe zwar leichte Erfahrungen mit VBScript, bin aber für jeden
Vorschlag/Tipp offen.

Gruß
Ralf

Loading...