Implémenter un outil personnalisé de résolution des conflits pour un article de fusion
S'applique à : SQL Server
Cette rubrique décrit comment implémenter l’outil personnalisé de résolution des conflits pour un article de fusion dans SQL Server à l’aide de Transact-SQL ou du programme de résolution personnalisé COM.
Dans cette rubrique
Implémenter un outil personnalisé de résolution des conflits pour un article de fusion à l’aide de :
Un programme de résolution s’appuyant sur l’architecture COM
Utilisation de Transact-SQL
Vous pouvez écrire votre propre outil personnalisé de résolution des conflits sous forme de procédure stockée Transact-SQL au niveau de chaque serveur de publication. Pendant la synchronisation, cette procédure stockée est appelée quand des conflits sont rencontrés dans un article auprès duquel l’outil de résolution a été inscrit. Les informations sur la ligne en conflit sont transmises par l’Agent de fusion aux paramètres requis de la procédure. Les outils personnalisés de résolution des conflits s'appuyant sur des procédures stockées sont toujours créés au niveau du serveur de publication.
Remarque
Les programmes de résolution des procédures stockées Microsoft SQL Server sont appelés uniquement pour gérer les conflits liés à des modifications de ligne. Ils ne peuvent pas être utilisés pour gérer d’autres types de conflits, comme les échecs d’insertion déclenchés par des violations de clés primaires ou des violations de contraintes d’index unique.
Pour créer un outil personnalisé de résolution des conflits s'appuyant sur des procédures stockées
Dans la base de données de publication ou la base de données msdb sur le serveur de publication, créez une procédure stockée système qui implémente les paramètres requis suivants :
Paramètre Type de données Description @tableowner sysname Nom du propriétaire de la table pour laquelle un conflit est résolu. Il s'agit du propriétaire de la table dans la base de données de publication. @tablename sysname Nom de la table pour laquelle un conflit est résolu. @rowguid uniqueidentifier Identificateur unique de la ligne en conflit. @subscriber sysname Nom du serveur à partir duquel une modification en conflit est propagée. @subscriber_db sysname Nom de la base de données à partir de laquelle une modification en conflit est propagée. @log_conflict OUTPUT int Définit si le processus de fusion doit enregistrer un conflit en vue de le résoudre ultérieurement :
0 = ne pas enregistrer le conflit.
1 = l'Abonné est le perdant du conflit.
2 = le serveur de publication est le perdant du conflit.@conflict_message OUTPUT nvarchar(512) Message accompagnant la résolution si le conflit est enregistré. @destowner sysname Propriétaire de la table publiée créée sur l'Abonné. Cette procédure stockée utilise les valeurs transmises par l’Agent de fusion à ces paramètres pour implémenter votre logique de résolution de conflit personnalisée. Elle doit retourner un jeu de résultats de ligne unique dont la structure est identique à celle de la table de base, et qui contient les valeurs de données pour la version gagnante de la ligne.
Accordez les autorisations EXECUTE sur la procédure stockée à toutes connexions utilisées par les Abonnés pour se connecter au serveur de publication.
Utiliser un outil personnalisé de résolution des conflits avec un nouvel article de table
Exécutez sp_addmergearticle pour définir un article.
Spécifiez la valeur MicrosoftSQL Server Stored Procedure Resolver pour le paramètre @article_resolver.
Spécifiez le nom de la procédure stockée qui implémente la logique de l’outil de résolution des conflits pour le paramètre @resolver_info.
Pour plus d’informations, consultez Définir un article.
Pour utiliser un outil de résolution des conflits personnalisé avec un article de table existant
Exécutez sp_changemergearticle en spécifiant @publication, @article, en affectant la valeur article_resolver à @property et en affectant la valeur MicrosoftSQL Server Stored ProcedureResolver à @value.
Exécutez sp_changemergearticle, en spécifiant @publication, @article, en affectant la valeur resolver_info à @propertyet en spécifiant le nom de la procédure stockée qui implémente la logique de l'outil de résolution des conflits pour @value.
Utilisation d’un outil de résolution personnalisé basé sur COM
L’espace de noms Microsoft.SqlServer.Replication.BusinessLogicSupport implémente une interface qui vous permet d’écrire une logique métier complexe afin de gérer les événements et de résoudre les conflits qui se produisent au cours du processus de synchronisation de la réplication de fusion. Pour plus d’informations, consultez Implémenter un gestionnaire de logique métier pour un article de fusion. Vous pouvez également écrire votre propre logique métier personnalisée en code natif pour résoudre ces conflits. Cette logique est construite sous la forme d’un composant COM et compilée dans des bibliothèques de liens dynamiques (DLL) à l’aide de produits tels que Microsoft Visual C++. Ce genre d’outil personnalisé de résolution des conflits basé sur COM doit implémenter l’interface ICustomResolver, qui est conçue spécifiquement pour la résolution des conflits.
Pour créer et enregistrer un outil de résolution des conflits personnalisé basé sur COM
Dans un environnement de création compatible COM, ajoutez des références à la bibliothèque de l'outil de résolution des conflits personnalisé.
Pour un projet Visual C++, utilisez la directive #import pour importer cette bibliothèque dans votre projet.
Créez une classe qui implémente l'interface ICustomResolver .
Implémentez certaines méthodes et propriétés.
Générez le projet de manière à créer le fichier bibliothèque de l'outil de résolution des conflits personnalisé.
Déployez la bibliothèque dans le répertoire qui contient l’exécutable de l’Agent de fusion (généralement \Microsoft SQL Server\100\COM).
Remarque
Un outil de résolution des conflits personnalisé doit être déployé sur l'Abonné pour un abonnement par extraction, sur le serveur de distribution pour un abonnement par émission de données ou sur le serveur Web utilisé avec la synchronisation Web.
Enregistrez la bibliothèque de l’outil de résolution des conflits personnalisé en exécutant regsvr32.exe à partir du répertoire de déploiement, comme suit :
regsvr32.exe mycustomresolver.dll
Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) pour vérifier que la bibliothèque n’est pas enregistrée en tant qu’outil de résolution des conflits personnalisé.
Pour enregistrer la bibliothèque en tant qu’outil de résolution des conflits personnalisé, exécutez sp_registercustomresolver (Transact-SQL) au niveau du serveur de distribution. Spécifiez le nom convivial de l'objet COM pour @article_resolver, l'ID de la bibliothèque (CLSID) pour @resolver_clsidet affectez la valeur false à @is_dotnet_assembly.
Remarque
Quand vous n’en avez plus besoin, vous pouvez désenregistrer un outil de résolution des conflits personnalisé à l’aide de sp_unregistercustomresolver (Transact-SQL).
(Facultatif) Sur un cluster, répétez les étapes 6 à 9 pour enregistrer l’outil de résolution personnalisé sur tous les nœuds du cluster. Cette procédure est nécessaire pour garantir que l’outil de résolution personnalisé peut charger correctement le réconciliateur suite à un basculement.
Pour utiliser un outil de résolution des conflits personnalisé avec un nouvel article de table
Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) et notez le nom convivial du programme de résolution souhaité.
Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergearticle (Transact-SQL) pour définir un article. Spécifiez le nom convivial du programme de résolution d'articles obtenu à l'étape 1 pour @article_resolver. Pour plus d’informations, consultez Définir un article.
Pour utiliser un outil de résolution des conflits personnalisé avec un article de table existant
Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) et notez le nom convivial du programme de résolution souhaité.
Exécutez sp_changemergearticle (Transact-SQL) en spécifiant@publication, @article, en affectant une valeur article_resolver à @property et en affectant le nom convivial du programme de résolution d’articles obtenu à l’étape 1 à @value.