Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Nachdem eine Publikation oder ein Abonnement initialisiert wurde, verfolgt und zählt die Mergereplikation alle Änderungen an den Daten in veröffentlichten Tabellen auf. Änderungen werden durch Trigger nachverfolgt (die die Replikation für jede veröffentlichte Tabelle erstellt) und durch Systemtabellen in den Publikations- und Abonnementdatenbanken. Diese Replikationssystemtabellen werden mit Metadaten aufgefüllt, die angibt, welche Änderungen weitergegeben werden sollen. Wenn der Zusammenführungs-Agent während der Synchronisierung ausgeführt wird, werden Änderungen vom Agent aufgezählt und dann nach Bedarf auf den Herausgeber und den Abonnenten angewendet.
Änderungsnachverfolgung
Die Mergereplikation verwendet die folgenden Auslöser und Systemtabellen, um Änderungen für alle veröffentlichten Tabellen nachzuverfolgen:
-
MSmerge_ins_<GUID>: Auslöser einfügen (der GUID-Wert für diesen und die anderen Auslöser wird aussysmergearticlesabgeleitet) -
MSmerge_upd_<GUID>: Auslöser aktualisieren MSmerge_del_<GUID>: Auslöser löschenMSmerge_contentsMSmerge_tombstoneMSmerge_genhistory
Die Merge-Replikation verwendet die folgenden zusätzlichen Systemtabellen, um Änderungen für gefilterte Tabellen nachzuverfolgen.
MSmerge_partition_groupsMSmerge_current_partition_mappingsMSmerge_past_partition_mappings
Hinweis
Die aufgelisteten Systemtabellen werden von allen Zusammenführungspublikationen und Abonnements in einer Datenbank verwendet; Wenn Sie beispielsweise mehr als eine Publikation in einer Publikationsdatenbank haben, MSmerge_contents enthält sie Zeilen aus Artikeln in allen Publikationen.
Änderungsnachverfolgung für nicht gefilterte Tabellen
Systemtabellen
Die Systemtabellen, die für ungefilterte und gefilterte Tabellen verwendet werden, enthalten die folgenden Metadaten:
MSmerge_contentsenthält eine Zeile für jede Zeile, die in einer veröffentlichten Tabelle in der Datenbank eingefügt oder aktualisiert wird.MSmerge_tombstoneenthält eine Zeile für jede Zeile, die aus einer veröffentlichten Tabelle in der Datenbank gelöscht wird.MSmerge_genhistoryenthält eine Zeile für jede Generation. Eine Generation ist eine Sammlung von Änderungen, die an einen Herausgeber oder Abonnenten übermittelt werden. Generationen werden jedes Mal geschlossen , wenn der Merge-Agent ausgeführt wird; Nachfolgende Änderungen in einer Datenbank werden einer oder mehreren offenen Generationen hinzugefügt.
Änderungsverfolgungsprozess
Der folgende Änderungsnachverfolgungsprozess wird für alle nicht gefilterten Tabellen verwendet:
Wenn in einer veröffentlichten Tabelle ein Einfügen oder Aktualisieren erfolgt, wird der
MSmerge_ins_<GUID>- oderMSmerge_upd_<GUID>-Trigger ausgelöst, und eine Zeile wird in dieMSmerge_contents-Systemtabelle eingefügt. Die SpalterowguidvonMSmerge_contentsenthält die GUID für die eingefügte oder aktualisierte Zeile, die angibt, dass die entsprechend eingegebene oder aktualisierte Zeile in der Benutzertabelle bei der nächsten Synchronisierung an die Verleger oder Abonnenten gesendet werden soll. Wenn nachfolgende Aktualisierungen in einer Zeile in einer Benutzertabelle auftreten, wird die Zeile inMSmerge_contentsaktualisiert, um diesen Zustand zu widerspiegeln.Wenn ein Löschvorgang in einer veröffentlichten Tabelle auftritt, wird der
MSmerge_del_<GUID>Auslöser ausgelöst, und eine Zeile wird in dieMSmerge_tombstoneSystemtabelle eingefügt. DierowguidSpalte vonMSmerge_tombstoneenthält die GUID für die gelöschte Zeile und deutet darauf hin, dass bei der nächsten Synchronisierung ein Löschvorgang für die entsprechende gelöschte Zeile in der Benutzertabelle an den Herausgeber oder die Abonnenten gesendet werden soll. Wenn auf die gelöschte Zeile verwiesenMSmerge_contentswird (da sie seit der letzten Synchronisierung eingefügt oder aktualisiert wurde), wird die Zeile aus gelöschtMSmerge_contents.
Änderungsnachverfolgung für gefilterte Tabellen
Systemtabellen
Zusätzlich zu den im vorherigen Abschnitt beschriebenen Systemtabellen enthalten drei Tabellen in der Publikationsdatenbank Metadaten zum Nachverfolgen von Änderungen an gefilterten Tabellen:
MSmerge_partition_groupsenthält eine Zeile für jede Partition, die in einer Publikation definiert ist. Partitionen können folgendes sein:Explizit mithilfe von
sp_addmergepartitionoder der Seite "Datenpartitionen" des Dialogfelds "Publikationseigenschaften" definiert.Wird automatisch erstellt, wenn ein Abonnent synchronisiert wird und der Abonnent eine Partition benötigt, die noch keinen Eintrag in
MSmerge_partition_groupshat.
MSmerge_current_partition_mappingsenthält eine Zeile für jede eindeutige Kombination aus Zeilen inMSmerge_contentsundMSmerge_partition_groups. Wenn beispielsweise eine Zeile in einer Benutzertabelle zu zwei Partitionen gehört und die Zeile aktualisiert wird, wird eine Zeile inMSmerge_contentseingefügt, um das Update zu reflektieren, und zwei Zeilen werden inMSmerge_current_partition_mappingseingefügt, um anzugeben, dass die aktualisierte Zeile zu den beiden Partitionen gehört.MSmerge_past_partition_mappingsenthält eine Zeile für jede Zeile, die nicht mehr zu einer bestimmten Partition gehört. Eine Zeile wird aus einer Partition verschoben, wenn:Die Zeile wird gelöscht. Wenn eine Zeile aus einer Benutzertabelle gelöscht wird, wird eine Zeile in
MSmerge_tombstoneeingefügt, und eine oder mehrere Zeilen werden inMSmerge_past_partition_mappingseingefügt.Der Wert in einer Spalte, die zum Filtern verwendet wird, wurde geändert. Wenn beispielsweise ein parametrisierter Filter auf dem Bundesland basiert, in dem ein Unternehmen seinen Hauptsitz hat, und das Unternehmen umzieht, kann die Zeile für das Unternehmen (und verwandte Zeilen in anderen Tabellen) aus der Datenpartition eines Vertriebsmitarbeiters in die Partition eines anderen Vertriebsmitarbeiters verschoben werden. Wenn eine Zeile so aktualisiert wird, dass sie nicht mehr zu einer Partition gehört, wird eine Zeile in
MSmerge_contentseingefügt oder aktualisiert, und eine oder mehrere Zeilen werden inMSmerge_past_partition_mappingseingefügt.
Hinweis
Wenn nicht-überlappende Partitionen mit einem Abonnement pro Partition (ein Wert von 3 für den Parameter @partition_options von sp_addmergearticle) verwendet werden, werden die Systemtabellen MSmerge_current_partition_mappings und MSmerge_past_partition_mappings nicht verwendet, um die Partitionszuordnungen der Zeilen nachzuverfolgen, da jede Zeile nur zu einer Partition gehört und nur bei einem Abonnenten geändert werden kann.
Änderungsverfolgungsprozess
Der zuvor beschriebene Prozess (im Abschnitt "Änderungsnachverfolgung für ungefilterte Tabellen") für nicht gefilterte Tabellen wird auch für gefilterte Tabellen mit den folgenden Ergänzungen verwendet:
Wenn ein Einfügevorgang in einer veröffentlichten Tabelle erfolgt, werden zusätzlich zu den Daten, die in
MSmerge_contentsaktualisiert oder eingefügt werden, für jede Partition, zu der die Zeile gehört, eine Partitionszuordnung zuMSmerge_current_partition_mappingshinzugefügt.Wenn in einer veröffentlichten Tabelle eine Aktualisierung erfolgt, werden zusätzlich zu den Daten, die aktualisiert oder in
MSmerge_contentseingefügt werden dürfen, für jede Partition, zu der die Zeile gehört und für die inMSmerge_current_partition_mappingskeine Partitionszuordnung existiert, eine hinzugefügt. Wenn das Update dazu führte, dass eine Zeile von einer Partition in eine andere verschoben wurde, wird eine Zeile aktualisiertMSmerge_current_partition_mappingsund einer hinzugefügtMSmerge_past_partition_mappings.Wenn ein Löschvorgang in einer veröffentlichten Tabelle erfolgt, wird eine Zeile in
MSmerge_tombstoneeingefügt, eine Zeile ausMSmerge_current_partition_mappingsgelöscht und eine inMSmerge_past_partition_mappingshinzugefügt.
Enumeration ändern
Systemtabellen und -verfahren
Wenn der Zusammenführungs-Agent ausgeführt wird, werden Änderungen mithilfe mehrerer Systemtabellen und gespeicherter Prozeduren aufgezählt:
MSmerge_genhistoryenthält eine Zeile für jede Generation. Eine Generation ist eine Sammlung von Änderungen, die an einen Herausgeber oder Abonnenten übermittelt werden. Generationen werden jedes Mal geschlossen , wenn der Merge-Agent ausgeführt wird; Nachfolgende Änderungen in einer Datenbank werden einer oder mehreren offenen Generationen hinzugefügt.sysmergesubscriptionsenthält Informationen zu Abonnements, einschließlich eines Datensatzes der letzten Generationen von Änderungen, die ein Knoten gesendet und empfangen hat. In der Publikationsdatenbank enthält diese Tabelle eine Zeile für den Herausgeber und eine Zeile für jeden Abonnenten. In einer Abonnementdatenbank enthält diese Tabelle in der Regel eine Zeile für den Abonnenten und eine Zeile für den Publisher.MSmerge_generation_partition_mappingswird nur für gefilterte Tabellen verwendet, wobei aufgezeichnet wird, ob eine bestimmte Generation änderungen enthält, die für eine bestimmte Partition relevant sind. Diese Tabelle in der Publikationsdatenbank enthält eine Zeile für jede eindeutige Kombination aus Zeilen inMSmerge_genhistoryundMSmerge_partition_groups.sp_MSmakegenerationschließt alle offenen Generierungen am Anfang des Enumerationsprozesses.sp_MSenumchangesListet Änderungen für Tabellen auf (mehrere verwandte Prozeduren, diesp_MSenumchangesmit Namen beginnen, werden ebenfalls in diesem Prozess verwendet).sp_MSgetmetadatabestimmt, ob eine Änderung von einem Knoten auf einen anderen Knoten als Einfüge-, Aktualisierungs- oder Löschvorgang angewendet werden soll.
Prozess zur Änderung der Enumeration
Der folgende Prozess tritt während der Änderungsenumeration auf:
Die Systemprozedur
sp_MSmakegenerationwird aufgerufen:Bei ungefilterten und gefilterten Tabellen schließt dieses Verfahren alle offenen Generationen, auf die in
MSmerge_genhistoryverwiesen wird (geschlossene Generationen haben in der Spaltegenstatuseinen Wert von1oder2).Bei gefilterten Tabellen füllt diese Prozedur die Systemtabelle
MSmerge_generation_partition_mappingsauf. Wenn eine Generation eine oder mehrere Änderungen enthält, die für eine Partition relevant sind, wird eine Zeile in die Systemtabelle eingefügt. Wenn eine Generation keine Änderungen enthält, die für eine bestimmte Partition relevant sind, wird eine Zeile nicht inMSmerge_generation_partition_mappingseingefügt, und Änderungen werden für Abonnenten, die diese Partition empfangen, nicht aufgezählt.
Die gespeicherte Prozedur
sp_MSenumchangesund zugehörige Prozeduren werden aufgerufen. In diesen Verfahren werden die Seit der letzten Synchronisierung aufgetretenen Änderungen aufgelistet:Die Prozeduren bestimmen zuerst die Generation, an der die Aufzählung beginnt, basierend auf den Spalten
sentgen(zuletzt gesendete Generation) undrecgen(zuletzt empfangene Generation) in der Tabellesysmergesubscriptions.Wenn Sie z. B. bestimmen, welche Generationenänderungen für einen bestimmten Abonnenten aufgelistet werden müssen, werden der
sentgenAbonnenten (in der Publikationsdatenbank gespeichert) und derrecgenAbonnenten (in der Abonnementdatenbank gespeichert) verglichen. Wenn die Werte identisch sind (was angibt, dass die letzte Generation, die vom Publisher gesendet wurde, erfolgreich vom Abonnenten empfangen wurde), werden Änderungen beginnend mit der nächsten Generation inMSmerge_genhistoryaufgelistet. Wenn die Werte nicht identisch sind, wird die untere der beiden Werte verwendet, um sicherzustellen, dass alle erforderlichen Änderungen gesendet werden.Die Prozeduren führen dann Änderungen auf:
Bei ungefilterten Tabellen werden alle Änderungen aufgezählt, die in Generationen nach der Generation
sentgenoderrecgenenthalten sind:MSmerge_genhistorywird mitMSmerge_contentsundMSmerge_tombstoneverknüpft, um zu bestimmen, welche Änderungen gesendet werden müssen.Bei gefilterten Tabellen wird
MSmerge_generation_partition_mappingsmitMSmerge_current_partition_mappingsundMSmerge_contentssowieMSmerge_past_partition_mappingsundMSmerge_tombstoneverbunden, um festzustellen, welche Änderungen für die Partition relevant sind, die der Abonnent erhält.
Die gespeicherte Prozedur
sp_MSgetmetadatawird aufgerufen, um zu bestimmen, ob eine Änderung als Einfüge-, Aktualisierungs- oder Löschvorgang angewendet werden soll. Zu diesem Zeitpunkt werden Konflikterkennung und -lösung durchgeführt; weitere Informationen finden Sie unter "Erkennen und Beheben von Konflikten durch die Zusammenführungsreplikation".
Verwandte Inhalte
- Mergereplikation
- MSmerge_contents (Transact-SQL)
- MSmerge_current_partition_mappings
- MSmerge_generation_partition_mappings (Transact-SQL)
- MSmerge_genhistory (Transact-SQL)
- MSmerge_partition_groups (Transact-SQL)
- MSmerge_past_partition_mappings (Transact-SQL)
- MSmerge_tombstone (Transact-SQL)
- sp_addmergearticle (Transact-SQL)
- sp_addmergepartition (Transact-SQL)
- sysmergearticles (Transact-SQL)
- sysmergesubscriptions (Transact-SQL)
- Verknüpfungsfilter
- Parametrisierte Filter – Parametrisierte Zeilenfilter