Comment la réplication de fusion effectue le suivi et l'énumération des modifications

Une fois qu'une publication ou qu'un abonnement a été initialisé, la réplication de fusion effectue le suivi et énumère toutes les modifications des données dans les tables publiées. Les modifications sont suivies par le biais de déclencheurs (créés par la réplication pour chaque table publiée) et de tables système dans les bases de données de publication et d'abonnement. Ces tables système de réplication sont remplies avec des métadonnées qui indiquent quelles modifications doivent être propagées. Lorsque l'Agent de fusion s'exécute pendant la synchronisation, les modifications sont énumérées par l'Agent puis appliquées au serveur de publication et à l'Abonné en fonction des besoins.

Suivi des modifications

La réplication de fusion utilise les déclencheurs et tables systèmes suivants pour effectuer le suivi des modifications de toutes les tables publiées :

  • MSmerge_ins_<GUID> : déclencheur d'insertion (la valeur GUID de ce déclencheur et des autres déclencheurs est dérivée de sysmergearticles)

  • MSmerge_upd_<GUID> : déclencheur de mise à jour

  • MSmerge_del_<GUID> : déclencheur de suppression

  • MSmerge_contents

  • MSmerge_tombstone

  • MSmerge_genhistory

La réplication de fusion se sert des tables système supplémentaires suivantes pour effectuer le suivi des modifications des tables filtrées :

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

Notes

Les tables système listées sont utilisées par toutes les publications et tous les abonnements d'une base de données ; par exemple, si vous avez plus d'une publication dans une base de données de publication, MSmerge_contents contient des lignes d'articles de toutes les publications.

Suivi des modifications pour les tables non filtrées

Tables système

Les tables système utilisées pour les tables filtrées et non filtrées contiennent les métadonnées suivantes :

  • MSmerge_contents contient une ligne pour chaque ligne insérée ou mise à jour dans une table publiée dans la base de données.

  • MSmerge_tombstone contient une ligne pour chaque ligne supprimée d'une table publiée dans la base de données.

  • MSmerge_genhistory contient une ligne pour chaque génération. Une génération est une collection de modifications remise à un serveur de publication ou à un Abonné. Les générations sont fermées à chaque exécution de l'Agent de fusion, les modifications suivantes dans une base de données sont ajoutées sur une ou plusieurs générations ouvertes.

Processus de suivi des modifications

Le processus de suivi des modifications suivant est utilisé pour toutes les tables non filtrées :

  • Lorsqu'une insertion ou une suppression se produit sur une table publiée, le déclencheur MSmerge_ins_<GUID> ou MSmerge_upd_<GUID> s'exécute, et une ligne est insérée dans la table système MSmerge_contents. La colonne rowguid de MSmerge_contents contient le GUID de la ligne insérée ou mise à jour, indiquant qu'à la prochaine synchronisation, la ligne insérée ou mise à jour correspondante dans la table utilisateur devra être envoyée au serveur de publication ou aux abonnés. Si d'autres mises à jour se produisent sur une ligne dans une table utilisateur, la ligne dans MSmerge_contents est mise à jour pour refléter cette modification.

  • Lorsqu'une suppression se produit sur une table publiée, le déclencheur MSmerge_del_<GUID> s'exécute, et une ligne est insérée dans la table système MSmerge_tombstone. La colonne rowguid de MSmerge_tombstone contient le GUID de la ligne supprimée, indiquant qu'à la prochaine synchronisation, une suppression doit être envoyée au serveur de publication ou aux abonnés pour la ligne supprimée correspondante dans la table utilisateur. Si la ligne supprimée est référencée dans MSmerge_contents (car elle a été insérée ou supprimée depuis la dernière synchronisation), la ligne est supprimée de MSmerge_contents.

Suivi des modifications pour les tables filtrées

Tables système

En plus des tables système décrites dans la section précédente, trois tables de la base de données de publication contiennent des métadonnées pour le suivi des modifications des tables filtrées :

  • MSmerge_partition_groups contient une ligne pour chaque partition définie dans une publication. Les partitions peuvent être :

    • Définies de manière explicite à l'aide de sp_addmergepartition ou de la page Partitions de données de la boîte de dialogue Propriétés de la publication.

    • Créées automatiquement lorsqu'un Abonné se synchronise si l'Abonné nécessite une partition ne disposant pas encore d'entrée dans MSmerge_partition_groups.

  • MSmerge_current_partition_mappings contient une ligne pour chaque combinaison unique de lignes dans MSmerge_contents et MSmerge_partition_groups. Par exemple, si une ligne d'une table utilisateur appartient à deux partitions et que la ligne est mise à jour, une ligne est insérée dans MSmerge_contents pour refléter la mise à jour, et deux lignes sont insérées dans MSmerge_current_partition_mappings pour indiquer que la ligne mise à jour appartient à deux partitions.

  • MSmerge_past_partition_mappings contient une ligne pour chaque ligne n'appartenant plus à une partition donnée. Une ligne est déplacée d'une partition si :

    • La ligne est supprimée. Si une ligne est supprimée d'une table utilisateur, une ligne est insérée dans MSmerge_tombstone et une ou plusieurs lignes sont insérées dans MSmerge_past_partition_mappings.

    • La valeur d'une colonne servant au filtrage a changé. Par exemple, si un filtre paramétré est basé sur le statut pour lequel une entreprise a son siège social et que l'entreprise déménage, la ligne de l'entreprise (et les lignes associées d'autres tables) peut se déplacer d'une partition de données d'un commercial vers la partition d'un autre commercial. Si une ligne est mise à jour de telle sorte qu'elle n'appartienne plus à une partition, une ligne est insérée ou mise à jour dans MSmerge_contents et une ou plusieurs lignes sont insérées dans MSmerge_past_partition_mappings.

Notes

Si des partitions qui ne se chevauchent pas avec un abonnement par partition sont utilisées (le paramètre @partition_options de sp_addmergearticle a la valeur 3), les tables système MSmerge_current_partition_mappings et MSmerge_past_partition_mappings ne sont pas utilisées pour effectuer le suivi des mappages de partition de lignes, car chaque ligne appartient à une seule partition et ne peut être modifiée que sur un seul abonné.

Processus de suivi des modifications

Le processus décrit ci-dessus (dans la section « Suivi des modifications pour les tables non filtrées ») pour les tables non filtrées est également utilisé pour les tables filtrées, avec les ajouts suivants :

  • Lorsqu'une insertion se produit sur une table publiée, en plus de la mise à jour ou de l'insertion des données dans MSmerge_contents, un mappage de partition est ajouté à MSmerge_current_partition_mappings pour chaque partition à laquelle appartient la ligne.

  • Lorsqu'une mise à jour se produit sur une table publiée, en plus de la mise à jour ou de l'insertion des données dans MSmerge_contents, un mappage de partition est ajouté s'il n'en existe pas dans MSmerge_current_partition_mappings pour chaque partition à laquelle appartient la ligne. Si la mise à jour a provoqué le déplacement d'une ligne d'une partition à l'autre, une ligne est mise à jour dans MSmerge_current_partition_mappings et une est ajoutée à MSmerge_past_partition_mappings.

  • Lorsqu'une suppression se produit sur une table publiée, en plus de l'insertion d'une ligne dans MSmerge_tombstone, une ligne est supprimée de MSmerge_current_partition_mappings et une est ajoutée à MSmerge_past_partition_mappings.

Énumération des modifications

Tables système et procédures

Lors de l'exécution de l'Agent de fusion, les modifications sont énumérées à l'aide de plusieurs tables système et procédures stockées :

  • MSmerge_genhistory contient une ligne pour chaque génération. Une génération est une collection de modifications remise à un serveur de publication ou à un Abonné. Les générations sont fermées à chaque exécution de l'Agent de fusion, les modifications suivantes dans une base de données sont ajoutées sur une ou plusieurs générations ouvertes.

  • sysmergesubscriptions contient des informations sur les abonnements, y compris un enregistrement des dernières générations de modifications qu'un nœud a envoyées et reçues. Dans la base de données de publication, cette table contient une ligne pour le serveur de publication et une ligne pour chaque abonné. Dans une base de données d'abonnement, cette table contient généralement une ligne l'Abonné et une pour le serveur de publication.

  • MSmerge_generation_partition_mappings est utilisée uniquement pour les tables filtrées et enregistre si une génération donnée contient des modifications relatives à une partition donnée. Cette table de la base de données de publication contient une ligne pour chaque combinaison unique de lignes dans MSmerge_genhistory et MSmerge_partition_groups.

  • sp_MSmakegeneration ferme toutes les générations ouvertes au début du processus d'énumération.

  • sp_MSenumchanges énumère les modifications pour les tables (plusieurs procédures associées portant des noms commençant par sp_MSenumchanges sont également utilisées dans ce processus).

  • sp_MSgetmetadata détermine si une modification d'un nœud doit être appliquée à un autre nœud comme insertion, mise à jour ou suppression.

Processus d'énumération des modifications

Le processus suivant s'exécute pendant l'énumération des modifications :

  1. La procédure système sp_MSmakegeneration est appelée :

    • Pour les tables non filtrées et filtrées, cette procédure ferme toutes les générations ouvertes référencées dans MSmerge_genhistory (les générations fermées ont une valeur égale à 1 ou 2 dans la colonne genstatus).

    • Pour les tables filtrées, cette procédure remplit la table système MSmerge_generation_partition_mappings. Si une génération contient une ou plusieurs modifications relatives à une partition, une ligne est insérée dans la table système. Si une génération ne contient aucune modification relative à une partition donnée, aucune ligne n'est insérée dans MSmerge_generation_partition_mappings, et les modifications ne sont énumérées pour aucun abonné recevant cette partition.

  2. La procédure stockée sp_MSenumchanges et des procédures associées sont appelées. Ces procédures énumèrent les modifications s'étant produites depuis que la dernière synchronisation s'est produite :

    1. Les procédures déterminent d'abord la génération sur laquelle démarre l'énumération, en se basant sur les colonnes sentgen (dernière génération envoyée) et recgen (dernière génération reçue) dans la table sysmergesubscriptions.

      Par exemple, pour déterminer quelles modifications de générations doivent être énumérées pour un abonné donné, les colonnes d'Abonné sentgen (stockée dans la base de données de publication), et recgen (stockée dans la base de données d'abonnement) sont comparées. Si les valeurs sont identiques (indiquant que la dernière génération envoyée à partir du serveur de publication a été reçue avec succès par l'Abonné), les modifications sont énumérées en commençant par la prochaine génération dans MSmerge_genhistory. Si les valeurs sont différentes, la plus petite des deux est utilisée pour s'assurer que toutes les modifications requises sont envoyées.

    2. Les procédures énumèrent ensuite les modifications :

      Pour les tables non filtrées, toutes les modifications contenues dans les générations postérieures à la génération dans sentgen ou recgen sont énumérées : MSmerge_genhistory est liée à MSmerge_contents et MSmerge_tombstone afin de déterminer quelles modifications doivent être envoyées.

      Pour les tables filtrées, MSmerge_generation_partition_mappings est liée à : MSmerge_current_partition_mappings et MSmerge_contents ; et MSmerge_past_partition_mappings et MSmerge_tombstone pour déterminer quelles sont les modifications relatives à la partition que reçoit l'Abonné.

  3. La procédure stockée sp_MSgetmetadata est appelée pour déterminer si une modification doit être appliquée comme une insertion, une mise à jour ou une suppression. À ce stade, la détection et la résolution des conflits sont effectuées ; pour plus d'informations, consultez Comment la réplication de fusion détecte et résout les conflits.