Delen via


Hoe samengevoegde replicatie wijzigingen bijhoudt en opsomt

Nadat een publicatie of abonnement is geïnitialiseerd, houdt de merge-replicatie alle wijzigingen in de gegevens in gepubliceerde tabellen bij en somt deze op. Wijzigingen worden bijgehouden via triggers (die door replicatie voor elke gepubliceerde tabel worden aangemaakt) en systeemtabellen in de publicatie- en abonnementsdatabases. Deze replicatiesysteemtabellen worden gevuld met metagegevens die aangeeft welke wijzigingen moeten worden doorgegeven. Wanneer de samenvoegagent wordt uitgevoerd tijdens de synchronisatie, worden wijzigingen door de agent geïnventariseerd en indien nodig toegepast op de uitgever en abonnee.

Wijzigingen bijhouden

Samenvoegreplicatie maakt gebruik van de volgende triggers en systeemtabellen om wijzigingen voor alle gepubliceerde tabellen bij te houden:

  • MSmerge_ins_<GUID>: trigger invoegen (de GUID-waarde voor deze trigger en de andere triggers zijn afgeleid van sysmergearticles)
  • MSmerge_upd_<GUID>: updatetrigger
  • MSmerge_del_<GUID>: trigger verwijderen
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Samenvoegreplicatie maakt gebruik van de volgende extra systeemtabellen om wijzigingen voor gefilterde tabellen bij te houden:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Opmerking

De vermelde systeemtabellen worden gebruikt door alle samenvoegpublicaties en abonnementen in een database; Als u bijvoorbeeld meer dan één publicatie in een publicatiedatabase hebt, MSmerge_contents bevat u rijen uit artikelen in alle publicaties.

Het bijhouden van wijzigingen voor niet-gefilterde tabellen

Systeemtabellen

De systeemtabellen die worden gebruikt voor niet-gefilterde en gefilterde tabellen bevatten de volgende metagegevens:

  • MSmerge_contents bevat één rij voor elke rij die is ingevoegd of bijgewerkt in een gepubliceerde tabel in de database.

  • MSmerge_tombstone bevat één rij voor elke rij die is verwijderd uit een gepubliceerde tabel in de database.

  • MSmerge_genhistory bevat één rij voor elke generatie. Een generatie is een verzameling wijzigingen die aan een uitgever of abonnee worden geleverd. Generaties worden gesloten telkens wanneer de samenvoegagent wordt uitgevoerd; latere wijzigingen in een database worden toegevoegd aan een of meer open generaties.

Proces voor het bijhouden van wijzigingen

Het volgende proces voor het bijhouden van wijzigingen wordt gebruikt voor alle niet-gefilterde tabellen:

  • Wanneer een invoeg- of bijwerkbewerking plaatsvindt in een gepubliceerde tabel, wordt de MSmerge_ins_<GUID> of MSmerge_upd_<GUID> trigger geactiveerd en wordt er een rij ingevoegd in de MSmerge_contents systeemtabel. De rowguid kolom bevat MSmerge_contents de GUID voor de ingevoegde of bijgewerkte rij, waarmee wordt aangegeven dat de volgende keer dat synchronisatie plaatsvindt, de bijbehorende ingevoegde of bijgewerkte rij in de gebruikerstabel moet worden verzonden naar de uitgever of abonnees. Als volgende updates plaatsvinden op een rij in een gebruikerstabel, wordt de rij in MSmerge_contents bijgewerkt om deze status weer te geven.

  • Wanneer een verwijdering plaatsvindt in een gepubliceerde tabel, wordt de MSmerge_del_<GUID> trigger geactiveerd en wordt er een rij ingevoegd in de MSmerge_tombstone systeemtabel. De kolom rowguid van MSmerge_tombstone bevat de GUID van de verwijderde rij, waarmee wordt aangegeven dat de volgende keer wanneer de synchronisatie plaatsvindt, een verwijderopdracht moet worden verzonden naar de Uitgever of Abonnees voor de bijbehorende verwijderde rij in de gebruikerstabel. Als naar de verwijderde rij wordt verwezen MSmerge_contents (omdat deze is ingevoegd of bijgewerkt sinds de laatste synchronisatie), wordt de rij verwijderd uit MSmerge_contents.

Wijzigingen bijhouden voor gefilterde tabellen

Systeemtabellen

Naast de systeemtabellen die in de vorige sectie worden beschreven, bevatten drie tabellen in de publicatiedatabase metagegevens voor het bijhouden van wijzigingen in gefilterde tabellen:

  • MSmerge_partition_groups bevat één rij voor elke partitie die is gedefinieerd in een publicatie. Partities kunnen:

    • Expliciet gedefinieerd met behulp van sp_addmergepartition of de pagina Gegevenspartities van het dialoogvenster Publicatie-eigenschappen.

    • Automatisch aangemaakt wanneer een abonnee synchroniseert, indien de abonnee een partitie nodig heeft die nog geen vermelding heeft in MSmerge_partition_groups.

  • MSmerge_current_partition_mappings bevat één rij voor elke unieke combinatie van rijen in MSmerge_contents en MSmerge_partition_groups. Als een rij in een gebruikerstabel bijvoorbeeld behoort tot twee partities en de rij wordt bijgewerkt, wordt één rij ingevoegd MSmerge_contents om de update weer te geven en worden er twee rijen ingevoegd in MSmerge_current_partition_mappings, om aan te geven dat de bijgewerkte rij deel uitmaakt van de twee partities.

  • MSmerge_past_partition_mappings bevat één rij voor elke rij die niet meer bij een bepaalde partitie hoort. Een rij wordt uit een partitie verplaatst als:

    • De rij wordt verwijderd. Als een rij uit een gebruikerstabel wordt verwijderd, wordt een rij ingevoegd in MSmerge_tombstone en worden een of meer rijen ingevoegd in MSmerge_past_partition_mappings.

    • De waarde in een kolom die wordt gebruikt voor filteren, is gewijzigd. Als een geparameteriseerd filter bijvoorbeeld is gebaseerd op de staat waarin een bedrijf is gevestigd en het bedrijf verhuist, kan de rij voor het bedrijf (en gerelateerde rijen in andere tabellen) verhuizen van het dataset van de ene verkoper naar dat van een andere verkoper. Als een rij zo wordt bijgewerkt dat deze niet langer bij een partitie hoort, dan wordt een rij ingevoegd of bijgewerkt in MSmerge_contents, en vervolgens worden een of meer rijen ingevoegd in MSmerge_past_partition_mappings.

Opmerking

Als niet-overlappende partities met één abonnement per partitie (een waarde van 3 voor de @partition_options parameter van sp_addmergearticle) worden gebruikt, worden de systeemtabellen MSmerge_current_partition_mappings en MSmerge_past_partition_mappings niet gebruikt om de partitietoewijzingen van de rijen bij te houden, omdat elke rij tot slechts één partitie behoort en alleen door slechts één abonnee kan worden gewijzigd.

Proces voor het bijhouden van wijzigingen

Het eerder beschreven proces (in de sectie Wijzigingen bijhouden voor niet-gefilterde tabellen) voor niet-gefilterde tabellen wordt ook gebruikt voor gefilterde tabellen, met de volgende toevoegingen:

  • Wanneer een invoeging plaatsvindt in een gepubliceerde tabel, wordt naast gegevens die worden bijgewerkt of ingevoegd in MSmerge_contents, een partitietoewijzing toegevoegd aan MSmerge_current_partition_mappings voor elke partitie waartoe de rij behoort.

  • Wanneer er een update plaatsvindt in een gepubliceerde tabel, naast het bijwerken of invoegen van gegevens in MSmerge_contents, wordt er een partitietoewijzing toegevoegd aan MSmerge_current_partition_mappings als er geen bestaat voor elke partitie waartoe de rij behoort. Als de update heeft geresulteerd in een rij die van de ene partitie naar de andere wordt verplaatst, wordt er een rij bijgewerkt MSmerge_current_partition_mappings en wordt er een toegevoegd aan MSmerge_past_partition_mappings.

  • Wanneer een verwijdering optreedt in een gepubliceerde tabel, wordt, naast een rij die wordt ingevoegd in MSmerge_tombstone, een rij verwijderd uit MSmerge_current_partition_mappings en een toegevoegd aan MSmerge_past_partition_mappings.

Opsomming wijzigen

Systeemtabellen en -procedures

Wanneer de samenvoegagent wordt uitgevoerd, worden wijzigingen opgesomd met behulp van verschillende systeemtabellen en opgeslagen procedures:

  • MSmerge_genhistory bevat één rij voor elke generatie. Een generatie is een verzameling wijzigingen die aan een uitgever of abonnee worden geleverd. Generaties worden gesloten telkens wanneer de samenvoegagent wordt uitgevoerd; latere wijzigingen in een database worden toegevoegd aan een of meer open generaties.

  • sysmergesubscriptions bevat informatie over abonnementen, waaronder een record van de laatste generaties wijzigingen die een knooppunt heeft verzonden en ontvangen. In de publicatiedatabase bevat deze tabel een rij voor Publisher en één rij voor elke abonnee. In een abonnementsdatabase bevat deze tabel doorgaans een rij voor de abonnee en een rij voor de uitgever.

  • MSmerge_generation_partition_mappings wordt alleen gebruikt voor gefilterde tabellen, waarin wordt opgenomen of een bepaalde generatie wijzigingen bevat die relevant zijn voor een bepaalde partitie. Deze tabel in de publicatiedatabase bevat één rij voor elke unieke combinatie van rijen in MSmerge_genhistory en MSmerge_partition_groups.

  • sp_MSmakegeneration sluit alle open generaties aan het begin van het opsommingsproces.

  • sp_MSenumchanges inventariseert wijzigingen voor tabellen (verschillende gerelateerde procedures met namen die beginnen met sp_MSenumchanges , worden ook in dit proces gebruikt).

  • sp_MSgetmetadata bepaalt of een wijziging van het ene knooppunt moet worden toegepast op een ander knooppunt als invoegen, bijwerken of verwijderen.

Opsommingsproces wijzigen

Het volgende proces vindt plaats tijdens de inventarisatie van wijzigingen:

  1. De systeemprocedure sp_MSmakegeneration wordt aangeroepen:

    • Voor niet-gefilterde en gefilterde tabellen sluit deze procedure alle geopende generaties waarnaar wordt verwezen MSmerge_genhistory (gesloten generaties hebben een waarde van 1 of 2 in de kolom genstatus).

    • Voor gefilterde tabellen wordt met deze procedure de systeemtabel MSmerge_generation_partition_mappingsgevuld. Als een generatie een of meer wijzigingen bevat die relevant zijn voor een partitie, wordt er een rij ingevoegd in de systeemtabel. Als een generatie geen wijzigingen bevat die relevant zijn voor een bepaalde partitie, wordt er geen rij ingevoegd in MSmerge_generation_partition_mappingsen worden wijzigingen niet opgesomd voor abonnees die die partitie ontvangen.

  2. De opgeslagen procedure sp_MSenumchanges en gerelateerde procedures worden aangeroepen. Deze procedures inventariseren de wijzigingen die zijn opgetreden sinds de laatste keer dat de synchronisatie heeft plaatsgevonden:

    1. De procedures bepalen eerst de generatie waarop opsomming begint, op basis van de kolommen sentgen (laatste generatie verzonden) en recgen (laatste generatie ontvangen) in de tabel sysmergesubscriptions.

      Wanneer u bijvoorbeeld bepaalt welke generaties wijzigingen moeten worden geïnventariseerd voor een bepaalde abonnee, worden de sentgen voor de abonnee (opgeslagen in de publicatiedatabase) en de recgen voor de abonnee (opgeslagen in de abonnementsdatabase) vergeleken. Als de waarden hetzelfde zijn (wat aangeeft dat de laatste generatie die door de uitgever is verzonden, is ontvangen door de abonnee), worden wijzigingen geïnventariseerd vanaf de volgende generatie in MSmerge_genhistory. Als de waarden niet hetzelfde zijn, wordt de onderste van de twee waarden gebruikt om ervoor te zorgen dat alle vereiste wijzigingen worden verzonden.

    2. De procedures inventariseren vervolgens wijzigingen:

      Voor niet-gefilterde tabellen worden alle wijzigingen die zijn opgenomen in generaties na de generatie in sentgen of recgen opgesomd. MSmerge_genhistory wordt samengevoegd met MSmerge_contents en MSmerge_tombstone om te bepalen welke wijzigingen moeten worden verzonden.

      Voor gefilterde tabellen MSmerge_generation_partition_mappings wordt gekoppeld aan: MSmerge_current_partition_mappings en MSmerge_contents; en MSmerge_past_partition_mappingsMSmerge_tombstone om te bepalen welke wijzigingen relevant zijn voor de partitie die de abonnee ontvangt.

  3. De opgeslagen procedure sp_MSgetmetadata wordt aangeroepen om te bepalen of een wijziging moet worden toegepast als invoegen, bijwerken of verwijderen. Op dit moment worden conflictdetectie en -oplossing uitgevoerd; Zie Hoe samenvoegreplicatie conflicten detecteert en oplost voor meer informatie.