Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une fois qu’une publication ou un abonnement est initialisé, la réplication par fusion effectue le suivi et énumère toutes les modifications apportées aux données dans les tables publiées. Les modifications sont suivies par le biais de déclencheurs (que la réplication crée pour chaque table publiée) et les tables système dans les bases de données de publication et d’abonnement. Ces tables système de réplication sont remplies de 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é si nécessaire.
Suivi des modifications
La réplication de fusion utilise les déclencheurs et les tables système suivantes pour suivre les modifications de toutes les tables publiées :
MSmerge_ins_<GUID>: insérer un déclencheur (la valeur GUID de ce déclencheur et les autres déclencheurs sont dérivés desysmergearticles)MSmerge_upd_<GUID>: déclencheur de mise à jourMSmerge_del_<GUID>: supprimer le déclencheurMSmerge_contentsMSmerge_tombstoneMSmerge_genhistory
La réplication de fusion utilise les tables système supplémentaires suivantes pour suivre les modifications apportées aux tables filtrées :
MSmerge_partition_groupsMSmerge_current_partition_mappingsMSmerge_past_partition_mappings
Remarque
Les tables système répertoriées sont utilisées par toutes les publications et tous les abonnements de fusion dans une base de données. Par exemple, si vous avez plusieurs publications dans une base de données de publication, MSmerge_contents contient des lignes provenant 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 non filtrées et filtrées contiennent les métadonnées suivantes :
MSmerge_contentscontient une ligne pour chaque ligne insérée ou mise à jour dans une table publiée dans la base de données.MSmerge_tombstonecontient une ligne pour chaque ligne supprimée d’une table publiée dans la base de données.MSmerge_genhistorycontient une ligne pour chaque génération. Une génération est un ensemble de modifications qui sont fournies à un éditeur ou à un abonné. Les générations sont fermées chaque fois que l’Agent de fusion s’exécute ; les modifications suivantes dans une base de données sont ajoutées à 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 mise à jour se produit sur une table publiée, le déclencheur
MSmerge_ins_<GUID>ouMSmerge_upd_<GUID>se déclenche, et une ligne est insérée dans la table systèmeMSmerge_contents. La colonnerowguiddeMSmerge_contentscontient le GUID de la ligne insérée ou mise à jour, indiquant qu'à la prochaine synchronisation, les lignes insérées ou mises à jour correspondantes dans la table utilisateur doivent être envoyées à l'éditeur ou aux abonnés. Si des mises à jour ultérieures se produisent sur une ligne d'une table utilisateur, la ligne dansMSmerge_contentsest mise à jour pour refléter cet état.Lorsqu’une suppression se produit sur une table publiée, le
MSmerge_del_<GUID>déclencheur se déclenche et une ligne est insérée dans laMSmerge_tombstonetable système. Larowguidcolonne deMSmerge_tombstonecontient le GUID de la ligne supprimée, indiquant que lors de la prochaine synchronisation, une suppression doit être envoyée à Publisher ou aux abonnés pour la ligne supprimée correspondante dans la table utilisateur. Si la ligne supprimée est référencéeMSmerge_contents(car elle a été insérée ou mise à jour depuis la dernière synchronisation), la ligne est supprimée deMSmerge_contents.
Suivi des modifications pour les tables filtrées
Tables système
Outre les 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 apportées aux tables filtrées :
MSmerge_partition_groupscontient une ligne pour chaque partition définie dans une publication. Les partitions peuvent être les suivantes :Défini explicitement à l’aide
sp_addmergepartitionou à la page Partitions de données de la boîte de dialogue Propriétés de la publication.Créé automatiquement lorsqu’un Abonné se synchronise si l’Abonné requiert une partition qui n’a pas encore d’entrée
MSmerge_partition_groups.
MSmerge_current_partition_mappingscontient une ligne pour chaque combinaison unique de lignes dansMSmerge_contentsetMSmerge_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éeMSmerge_contentspour refléter la mise à jour, et deux lignes sont insérées dansMSmerge_current_partition_mappings, pour indiquer que la ligne mise à jour appartient aux deux partitions.MSmerge_past_partition_mappingscontient une ligne pour chaque ligne qui n’appartient plus à une partition donnée. Une ligne sort 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
MSmerge_tombstoneet une ou plusieurs lignes sont insérées dansMSmerge_past_partition_mappings.La valeur d’une colonne utilisée pour le filtrage a changé. Par exemple, si un filtre paramétré est basé sur l'État où une entreprise a son siège social et que l'entreprise déménage, la ligne de l’entreprise (et les lignes associées dans d'autres tables) peut sortir de la partition de données d'un commercial pour aller dans la partition d'un autre commercial. Si une ligne est mise à jour de telle sorte qu’elle n’appartient plus à une partition, une ligne est insérée ou mise à jour
MSmerge_contentset une ou plusieurs lignes sont insérées dansMSmerge_past_partition_mappings.
Remarque
Si des partitions disjointes avec un abonnement par partition (une valeur de 3 pour le paramètre @partition_options de sp_addmergearticle) sont utilisées, les tables système MSmerge_current_partition_mappings et MSmerge_past_partition_mappings ne sont pas utilisées pour suivre les mappages de partition des lignes, car chaque ligne appartient à une seule partition et ne peut être modifiée que par un seul abonné.
Processus de suivi des modifications
Le processus décrit précédemment (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, les données sont mises à jour ou insérées dans
MSmerge_contents, et un mappage de partition est ajouté àMSmerge_current_partition_mappingspour chaque partition à laquelle appartient la ligne.Lorsqu'une mise à jour se produit sur une table publiée, en plus des données mises à jour ou insérées dans
MSmerge_contents, s'il n'existe pas de mappage de partition dansMSmerge_current_partition_mappingspour chaque partition à laquelle la ligne appartient, un mappage de partition est ajouté. Si la mise à jour a entraîné le déplacement d’une ligne d’une partition vers une autre, une ligne est mise à jourMSmerge_current_partition_mappingset une ligne 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 deMSmerge_current_partition_mappingset une ligne est ajoutée àMSmerge_past_partition_mappings.
Modifier l’énumération
Tables et procédures système
Lorsque l’Agent de fusion s’exécute, les modifications sont énumérées à l’aide de plusieurs tables système et procédures stockées :
MSmerge_genhistorycontient une ligne pour chaque génération. Une génération est un ensemble de modifications qui sont fournies à un éditeur ou à un abonné. Les générations sont fermées chaque fois que l’Agent de fusion s’exécute ; les modifications suivantes dans une base de données sont ajoutées à une ou plusieurs générations ouvertes.sysmergesubscriptionscontient 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 pour l’Abonné et une ligne pour le serveur de publication.MSmerge_generation_partition_mappingsest utilisé uniquement pour les tables filtrées, enregistrant si une génération donnée contient des modifications pertinentes pour une partition donnée. Cette table de la base de données de publication contient une ligne pour chaque combinaison unique de lignes dansMSmerge_genhistoryetMSmerge_partition_groups.sp_MSmakegenerationclôture toutes les générations ouvertes au début du processus d’énumération.sp_MSenumchangesénumère les modifications apportées aux tables (plusieurs procédures connexes qui ont des noms commençantsp_MSenumchangespar sont également utilisées dans ce processus).sp_MSgetmetadatadétermine si une modification d’un nœud doit être appliquée à un autre nœud en tant qu’insertion, mise à jour ou suppression.
Modifier le processus d’énumération
Le processus suivant se produit pendant l’énumération des modifications :
La procédure système
sp_MSmakegenerationest 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 de1ou de2dans la colonnegenstatus).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 pertinentes pour une partition, une ligne est insérée dans la table système. Si une génération ne contient aucune modification pertinente pour une partition donnée, une ligne n’est pas inséréeMSmerge_generation_partition_mappingset les modifications ne sont pas énumérées pour les Abonnés qui reçoivent cette partition.
La procédure
sp_MSenumchangesstockée et les procédures associées sont appelées. Ces procédures énumèrent les modifications qui se sont produites depuis la dernière synchronisation :Les procédures déterminent d’abord la génération à laquelle l’énumération démarre, en fonction des colonnes
sentgen(dernière génération envoyée) etrecgen(dernière génération reçue) dans la tablesysmergesubscriptions.Par exemple, lors de la détermination des modifications des générations à énumérer pour un Abonné donné, l’Abonné
sentgen(stocké dans la base de données de publication) et l’Abonnérecgen(stocké dans la base de données d’abonnement) sont comparés. Si les valeurs sont identiques (ce qui indique que la dernière génération envoyée par le serveur de publication a été reçue avec succès par l’Abonné), les modifications sont énumérées à partir de la prochaine génération dansMSmerge_genhistory. Si les valeurs ne sont pas identiques, la valeur inférieure des deux valeurs est utilisée pour s’assurer que toutes les modifications requises sont envoyées.Les procédures énumèrent ensuite les modifications :
Pour les tables non filtrées, toutes les modifications contenues dans des générations après la génération dans
sentgenourecgensont énumérées :MSmerge_genhistoryest jointe àMSmerge_contentsetMSmerge_tombstonepour déterminer les modifications à envoyer.Pour les tables filtrées,
MSmerge_generation_partition_mappingsest joint à :MSmerge_current_partition_mappingsetMSmerge_contents; etMSmerge_past_partition_mappingsMSmerge_tombstonepour déterminer quelles modifications sont pertinentes pour la partition que l’Abonné reçoit.
La procédure
sp_MSgetmetadatastockée est appelée pour déterminer si une modification doit être appliquée en tant qu’insertion, mise à jour ou 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.
Contenu connexe
- Réplication de fusion
- 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)
- Filtres de jointure
- Filtres paramétrables - Filtres de lignes paramétrables