Announcement

Collapse
No announcement yet.

Replikation: ein Server, mehrere Clients

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Replikation: ein Server, mehrere Clients

    Hallo Leute,

    ich weiß, dieses Thema ist schon häufig diskutiert worden, aber ich habe leider noch keine passende Anwtwort gefunden.

    Hier mein Problem:
    Wir verwenden hier ein Programm, welches für uns Entwickelt wurde. Bis jetzt haben unsere Außendienstmitarbeiter nur damit gearbeitet, wenn sie im Büro waren. Wir werden aber jetzt welche bekommen, die auch von unterwegs arbeiten sollen. Leider kann man da nicht immer eine Verbindung über einen Terminal-Server aufbauen.
    Die Lösung wäre also, die Datenbank auf den lokalen Computer zu kopieren (replizieren - mit einem installierten SQL-Server Express oder so) und der MA kann ganz normal damit arbeiten.
    So, jetzt aber das Problem: wir haben mehr als einen MA. Alle sollen so arbeiten können.
    Die ID der Tabellen ist ein Identy. Die Verknüpfung zu anderen Tabellen funktioniert auch darüber. Wenn jetzt aber z. B. drei MA ein neues Angebot erstellen, hat jeder einen Datensatz mit der gleichen ID.
    Ich habe in die Tabelle bereits ein Feld mit einer GUID und ein Feld mit einem Timestamp eingefügt. Die GUID wird beim Anlegen eines neuen Datensatzes erstellt, der Timestamp wird bei jeder Änderung aktualisiert.
    Ich kann also feststellen, ob ein Datensatz geändert oder neu angelegt wurde. Das sieht ungefähr so aus:

    Tabelle Angebote:
    ID|GUID|TS|Angebotsdaten ...

    Tebelle AngeboteArtikel
    ID|GUID|TS|Angebot (verknüpft mit Angebote.ID)|Artikeldaten ...

    Ich hoffe, Ihr kennt euch so aus, wie ich es beschrieben habe.

    Ich möchte jetzt die Datenbanken replizieren (in beide Richtungen, vom Client zum Server und umgekehrt).

    Wie kann ich einen neuen Datensatz vom Client auf den Server kopieren und dabei alle verknüpften Daten mitkopieren und dabei die Zuweisung ändern?

    Wie kann ich die Daten von einer Datenbank auf die andere übernehmen (z. B. am Server wurde zu einem Angebot eine Zeile hinzugefügt oder entfernt ...)

    Mir fehlt da im Moment generell ein wenig der Plan. Vielleicht könnt Ihr mir ein wenige beim Denken helfen.

    Danke, Markus

  • #2
    Hallo Markus,


    Leider kann man da nicht immer eine Verbindung über einen Terminal-Server aufbauen.
    Geht schon, UMTS Stick + Flatrate für 25,- mtl; wäre definitiv die einfachste Variante.


    Zur Replikation, um in beiden Richtungen Daten zu aktualisieren, gibt es die Merge-Replikation.
    Das funktioniert gut, wenn die GUID der Primary Key ist, was bei Dir nicht der Fall ist.

    Man kann in der Replikation den "Abonnenten" Ranges für Identity-Ids zuweisen und auch "Insert Identity" festlegen, also das die in der Quelle erstellte Id auf die Publikationsdatenbank übernommen wird und nicht neu erstellt wird.
    Aber: Sofern vorher nicht vorhanden, den sonst wird der Datensatz überschrieben.

    Tipp:
    Um die Replikation zu testen, legt Dir mal eine neue Datenbank an mit zwei/drei Tabellen, die Deinem Aufbau entsprechen.
    Als Abonnent kann der gleiche Sql Server + eine weitere neue Datenbank fungieren.
    Dann kannst Du austesten, wie es funktioniert.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hmm ... ich denke, ich verstehe ...

      Eine Merge-Replikation funktioniert bei mir nicht, da es ja passieren kann, dass es eine ID öfters gibt.

      Ich könnte die Replikation auch in einem eigenen Programm haben (wär vielleicht garnicht so blöd ...).

      Ich müsste dann die Quell-Datenbank öffnen, jede Tabelle durchlaufen, schauen ob es die GUID schon gibt, wenn nicht, den Datensatz neu anlegen und die verknüpften Tabellen auch gleich aktualisieren, damit der richtige FK eingesetzt wird ... so weit richtig?

      Mein Problem ist aber, ich hab in meiner Datenbank mehrere hundert Tabellen und bei jedem Update der SW kommen noch einige hinzu. Das heißt, ich müsste das ganze automatisch machen.

      Ich hab mir bereits ein Programm gebaut, mit dem ich die Tabellen einer Datenbank auslesen kann. Kann ich die Beziehungen z. B. per SQL ermittlen?

      Zum Thema UMTS-Stick: wäre eine Möglichkeit, aber funktioniert eben leider nicht überall ... und ich weiß nicht, ob Du schon mit Vertretern gearbeitet hast ... aber wehe das Programm funktioniert mal nicht

      Comment


      • #4
        Eine Merge-Replikation funktioniert bei mir nicht, da es ja passieren kann, dass es eine ID öfters gibt
        Das ist halt das Problem mit Datenbanken von externen, da kann man leider nicht immer so rumbasteln wie man möchte, z.B. im nachhinein alle Ids auf den Type GUID umstellen.
        Spätestens mit dem nächsten Update geht es schief.

        die Replikation auch in einem eigenen Programm
        Geht auch, muss man nur sehen, welchen Aufwand man treiben will; z.B. wie intelligent ein Konfliktlöser sein soll.

        Sieh Dir mal den Thread hier an, da hatten wir schon mal etwas über Replikation diskutiert, da ist auch ein Beispiel-SQL Script, mit dem man Daten zwischen 2 Quellen synchronisieren kann.
        Nur ist eben kein Konfliktlöser drin; wer zuletzt schreibt, hat gewonnen:
        http://entwickler-forum.de/showthread.php?t=54179
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          hmm ... ok, nach einigem Gebrüble denke ich, ich sollte die Replikation in einem eigenen Programm machen (dann kann ich auch einen schönen Progress-Bar anzeigen.

          Jetzt hab ich nur noch das Problem ... wie

          Hmm ... ich glaub, da werd ich mal eine Nachtschicht einlegen und mir mal ein vernünftiges Konzept überlegen wie ich das machen könnte.
          Wenn jemand eine kleine Anregung hat, bin ich natürlich dankbar ...

          Comment


          • #6
            Falls Du es mit .NET umsetzen willst, sieh Dir mal das "MS Sync Framework" an; das ist für solche Anwendungsszenarien gedacht.
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              An das hab ich auch schon gedacht. Aber ich habs mir noch nicht so genau angesehen. Ich werd mir das mal zu Gemüte führen.

              Danke

              Comment

              Working...
              X