Fehlende Übereinstimmung der Daten auf dem Verleger und auf dem Abonnenten

Die Daten auf dem Verleger und auf dem Abonnenten gelten in den folgenden Fällen als nicht übereinstimmend:

  • Auf dem Abonnenten liegt eine andere Anzahl an Reihen vor als auf dem Verleger, und die Veröffentlichung ist nicht gefiltert. Falls die Veröffentlichung gefiltert wurde, ist eine abweichende Zeilenanzahl zu erwarten.

  • Mindestens eine Zeile auf dem Verleger und auf dem Abonnenten enthält einen anderen Inhalt.

Erklärung

Die Daten auf dem Verleger und auf dem Abonnenten können aus einer Reihe von Gründen voneinander abweichen:

  • Es werden Daten bei einem Abonnenten aktualisiert, die eigentlich schreibgeschützt sein sollten. Die Abonnementdatenbank sollte schreibgeschützt sein, es sei denn Sie verwenden die Mergereplikation, die Transaktionsreplikation mit aktualisierbaren Abonnements oder die Peer-zu-Peer-Transaktionsreplikation.

  • Auf dem Abonnenten werden Trigger verwendet. Die Trigger können die Daten auf dem Abonnementen verändern und auch die Aktualisierung der Daten unterbinden, wenn der Trigger eine ROLLBACK-Anweisung ausgibt.

  • Im Rahmen der Replikation werden Skripts auf dem Abonnenten ausgeführt, nicht jedoch auf dem Verleger.

  • Die Replikation der Ausführung der gespeicherten Prozedur für eine Transaktionsveröffentlichung führt auf dem Abonnenten zu unterschiedlichen Ergebnissen.

  • Zeilen können aufgrund von Einschränkungsverletzungen oder anderen Problemen auf dem Abonnenten nicht eingefügt, aktualisiert oder gelöscht werden.

Benutzeraktion

Die folgenden Aktionen beschreiben, wie Sie ermitteln können, ob die Daten voneinander abweichen, und wie Sie die Daten wieder in Übereinstimmung bringen:

  1. Ermitteln Sie mithilfe einer Überprüfung oder mit dem Hilfsprogramm tablediff, ob die Daten nicht miteinander übereinstimmen:

    • Wenn der Verteilungs-Agent oder der Merge-Agent ausgeführt werden kann, stellen Sie fest, ob Daten fehlen, indem Sie eine binäre Prüfsummenüberprüfung ausführen. Sie können auch eine Zeilenanzahlüberprüfung verwenden, bei dieser Methode werden aber Unterschiede im Inhalt der Daten nicht aufgedeckt. Weitere Informationen finden Sie unter Überprüfen von replizierten Daten.

    • Wenn der Verteilungs-Agent oder der Merge-Agent nicht ausgeführt werden kann, stellen Sie fest, ob Daten voneinander abweichen, indem Sie das Hilfsprogramm tablediff ausführen. Informationen zum Verwenden dieses Hilfsprogramms bei replizierten Tabellen finden Sie unter Vorgehensweise: Überprüfen replizierter Tabellen auf Unterschiede (Replikationsprogrammierung).

  2. Weichen die Daten voneinander ab, können Sie mit dem Hilfsprogramm tablediff ein Transact-SQL-Skript erstellen und damit die Daten wieder in Übereinstimmung bringen. Weitere Informationen finden Sie unter tablediff (Dienstprogramm).

Ermitteln der Ursache für die Nichtübereinstimmung

Mit den folgenden Aktionen können Sie den im Abschnitt zu "Erläuterung" angegebenen Ursachen auf den Grund gehen:

  • Die Daten werden auf dem Abonnenten außerhalb der Replikationsverfahren aktualisiert:

    • Wenn Sie den Benutzern das Einfügen, Aktualisieren und Löschen der Daten auf dem Abonnenten ermöglichen möchten, verwenden Sie die Mergereplikation, die Transaktionsreplikation mit aktualisierbaren Abonnements oder die Peer-zu-Peer-Transaktionsreplikation. Weitere Informationen finden Sie unter Mergereplikation (Übersicht) und Veröffentlichungstypen der Transaktionsreplikation.

    • Wenn die Benutzer keine Daten auf dem Abonnenten einfügen, aktualisieren und löschen können sollen, erstellen Sie für jede Tabelle einen Trigger, der das Wort ROLLBACK enthält, und verwenden Sie die Option NOT FOR REPLICATION (dadurch wird verhindert, dass der Trigger ausgelöst wird, wenn ein Replikations-Agent eine Operation ausführt). Beispiel:

      USE AdventureWorks2008R2;
      GO
      CREATE TRIGGER prevent_user_dml
      ON Person.Address
      FOR INSERT, UPDATE, DELETE
      NOT FOR REPLICATION
      AS
      ROLLBACK;
      

      Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL) und Steuern von Einschränkungen, Identitäten und Triggern mithilfe von NOT FOR REPLICATION.

  • Auf dem Abonnenten werden Trigger verwendet. Trigger auf dem Abonnenten müssen ordnungsgemäß verwaltet werden, damit sie nicht zu Nichtkonvergenz oder zu anderen Problemen führen:

    • Trigger dürfen nur zu Datenänderungen auf einem Abonnenten führen, wenn Sie die Mergereplikation, die Transaktionsreplikation mit aktualisierbaren Abonnements oder die Peer-zu-Peer-Transaktionsreplikation verwenden. Weitere Informationen finden Sie unter Mergereplikation (Übersicht) und Veröffentlichungstypen der Transaktionsreplikation.

    • In vielen Fällen sollten Trigger die NOT FOR REPLICATION-Option verwenden. Angenommen, ein Trigger fügt Daten in eine Nachverfolgungstabelle ein: Wenn der Benutzer die ursprüngliche Zeile einfügt, muss der Trigger ausgelöst werden und eine Zeile in die Nachverfolgungstabelle eintragen. Der Trigger sollte jedoch nicht ausgelöst werden, wenn diese Daten auf dem Abonnenten repliziert werden, da sonst eine überflüssige Zeile in die Nachverfolgungstabelle eingefügt wird.

      Wenn ein Trigger eine ROLLBACK-Anweisung enthält und der Trigger nicht die NOT FOR REPLICATION-Option verwendet, kann es passieren, dass Zeilen, die auf einen Abonnenten repliziert wurden, nicht angewendet werden.

    • Bei der Transaktionsreplikation sind zusätzliche Überlegungen zur XACT_ABORT-Einstellung und zum Verwenden der COMMIT- und ROLLBACK-Anweisungen in einem Trigger anzustellen. Weitere Informationen dazu finden Sie im Abschnitt zu den Triggern unter Überlegungen zur Transaktionsreplikation.

  • Im Rahmen der Replikation werden Skripts auf dem Abonnenten ausgeführt, nicht jedoch auf dem Verleger.

    Mithilfe der @pre_snapshot_script- und @post_snapshot_script-Parameter von sp_addpublication und sp_addmergepublication können Sie angeben, ob die Skripts vor oder nach dem Anwenden der Momentaufnahme ausgeführt werden sollen. Weitere Informationen finden Sie unter Ausführen von Skripts vor und nach dem Anwenden des Snapshots. Die gespeicherte Prozedur sp_addscriptexec ermöglicht die Ausführung eines Skripts während des Synchronisierungsprozesses. Weitere Informationen finden Sie unter Vorgehensweise: Ausführen von Skripts während der Synchronisierung (Replikationsprogrammierung mit Transact-SQL).

    Diese Skripts werden typischerweise für Verwaltungsaufgaben verwendet, wie z. B. für das Hinzufügen von Benutzernamen auf dem Abonnenten. Wenn die Skripts zum Aktualisieren von Daten auf einem Abonnenten verwendet werden, die als schreibgeschützt zu behandeln sind, muss der Administrator sicherstellen, dass keine Nichtkonvergenz entsteht.

  • Die Replikation der Ausführung der gespeicherten Prozedur für eine Transaktionsveröffentlichung führt auf dem Abonnenten zu unterschiedlichen Ergebnissen.

    Wenn Sie die Ausführung einer gespeicherten Prozedur replizieren, wird die Prozedurdefinition beim Initialisieren des Abonnements auf den Abonnenten repliziert. Wird die Prozedur auf dem Verleger ausgeführt, führt die Replikation die entsprechende Prozedur auf dem Abonnenten aus. Weitere Informationen finden Sie unter Veröffentlichen der Ausführung von gespeicherten Prozeduren in der Transaktionsreplikation.

    Wenn die gespeicherte Prozedur eine andere Aktion auf dem Abonnenten ausführt oder auf der Basis anderer Daten als der Daten auf dem Verleger agiert, kann es zu Nichtkonvergenz kommen. Stellen Sie sich z. B. eine Prozedur vor, die eine Berechnung vornimmt und die dann die auf dieser Berechnung basierenden Daten einfügt. Wenn der Abonnent so gefiltert wird, dass die Berechnung auf dem Abonnenten auf der Grundlage anderer Daten erfolgt, kann das auf dem Abonnenten eingefügte Ergebnis abweichen, oder die berechneten Daten werden überhaupt nicht eingefügt.

  • Zeilen können aufgrund von Einschränkungsverletzungen oder anderen Problemen auf dem Abonnenten nicht eingefügt, aktualisiert oder gelöscht werden.

    Bei einer Transaktionsreplikation werden Einschränkungsverletzungen als Fehler behandelt. Sie führen dazu, dass der Verteilungs-Agent die Synchronisierung beendet. (Informationen zum Übergehen dieser Fehler finden Sie unter Überspringen von Fehlern in der Transaktionsreplikation.) Bei einer Mergereplikation werden Einschränkungsverletzungen als Konflikte behandelt. Diese Konflikte werden zwar protokolliert, führen aber nicht dazu, dass der Merge-Agent die Synchronisierung beendet. Bei beiden Replikationstypen können Einschränkungsverletzungen zu Nichtkonvergenz führen, wenn eine an einem Knoten erfolgte Einfügung, Aktualisierung oder Löschung nicht auch an einem anderen Knoten erfolgt.

    Beim Veröffentlichen einer Tabelle wird durch die Standardschemaoptionen angegeben, dass FOREIGN KEY- und CHECK-Einschränkungen in der Abonnementdatenbank mit dem Optionssatz NOT FOR REPLICATION zu erstellen sind. Wenn Ihre Anwendung andere Einstellungen für die Einschränkungen verlangt, ändern Sie die Schemaoptionen entsprechend. Weitere Informationen finden Sie unter Vorgehensweise: Angeben von Schemaoptionen (SQL Server Management Studio) und Vorgehensweise: Angeben von Schemaoptionen (Replikationsprogrammierung mit Transact-SQL).

Siehe auch

Konzepte