Ich habe festgestellt, dass SQL Server beim Einrichten einer Transaktionsreplikation die Verwaltung des Identitätsbereichs auf manuell setzt. Dies bedeutet, dass in meiner Abonnementdatenbank beim Versuch, einen neuen Datensatz in eine Tabelle einzufügen, deren PK eine Identitätsspalte ist, eine Fehlermeldung angezeigt wird und angegeben wird, dass versucht wurde, eine PK von "1", "2" einzufügen "," 3 "usw. Dies liegt daran, dass der aktuelle Identitätswert für alle Identitätsspalten auf dem Abonnenten auf den Startwert (normalerweise 1) zurückgesetzt wird, anstatt auf dem Stand des Herausgebers zu bleiben.
Ich verstehe, warum SQL Server dies tut - Sie sollten die Abonnententabelle schreibgeschützt lassen. Mein Szenario ist jedoch etwas unorthodox - ich aktualisiere meinen Abonnenten von Zeit zu Zeit durch Replikation, mache eine sofortige Sicherung dieser Datenbank und möchte dann einige Aktualisierungen für den Abonnenten vornehmen, die dann NICHT an den Herausgeber zurückgeschickt werden Wenn ich den Abonnenten erneut aktualisiere, stelle ich seine Datenbank aus der früheren Sicherung wieder her und rufe die neuesten Updates ab. Da ich zwischen diesen Aktualisierungen Aktualisierungen für den Abonnenten durchführen möchte (wenn Sie so wollen, "temporäre Deltas"), muss die Identitätsspalte funktionieren und beim Replizieren nicht auf 1 zurückgesetzt werden.
Ich habe versucht, die automatische Verwaltung des Identitätsbereichs beim Einrichten meiner Publikation zu aktivieren. Dabei wird jedoch nur der folgende Fehler angezeigt, wenn ich versuche, der Publikation eine Tabelle hinzuzufügen:
Meldung 21231, Ebene 16, Status 1, Prozedur sp_MSrepl_addarticle, Zeile 2243 Die
automatische Unterstützung des Identitätsbereichs ist nur für Veröffentlichungen nützlich, in denen Abonnenten aktualisiert werden können.
Gibt es eine Möglichkeit, dieses Problem zu umgehen? Ich möchte diese Replikation SQL Server so präsentieren, als wäre sie auf Abonnentenseite schreibgeschützt, da ich nicht vorhabe, Aktualisierungen vorzunehmen , die an den Herausgeber zurückgesendet werden , aber ich möchte vorübergehende Aktualisierungen vornehmen wird vor der nächsten Replikation gelöscht.
Ich habe auch in Betracht gezogen, dass die Snapshot-Replikation für mein Verwendungsmuster eine geeignetere Methode als die Transaktionsreplikation sein könnte, aber das Problem ist, dass bei der Snapshot-Replikation bei jedem einzelnen Update die gesamte verdammte Datenbank gesendet werden muss. Da ich vorhabe, nach der letzten Replikation sofort eine Sicherungskopie der Datenbank zu erstellen, sollte ich nicht jedes Mal die gesamte Übertragung durchführen müssen. nur die Änderungen seit dem letzten Mal.
Is there any way I can get round this problem?
Sie müssen die Identitätsspalte mit sys.sp_identitycolumnforreplication für SQL Server 2005 und höher als NOT FOR REPLICATION festlegen . Sie müssen Ihre Artikel nicht einmal erneut aufnehmen, wenn Sie die Identitätsspalte als nicht für die Replikation ändern. Mach es einfach nicht mit der GUI.