Implémenter un outil personnalisé de résolution des conflits pour un article de fusion
Cette rubrique décrit comment implémenter l'outil personnalisé de résolution des conflits pour un article de fusion dans SQL Server 2012 à l'aide de Transact-SQL ou du programme de résolution personnalisé COM.
Dans cette rubrique
Pour implémenter l'outil personnalisé de résolution des conflits pour un article de fusion à l'aide de :
Transact-SQL
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. Au cours de la synchronisation, cette procédure stockée est appelée en cas de conflits dans un article pour lequel ce programme de résolution a été enregistré, et les informations sur la ligne en conflit sont passées 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 de changement de ligne. Ils ne peuvent pas être utilisés pour gérer d'autres types de conflits, comme les échecs d'insertion en raison de violations de clés primaires ou de 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 depuis lequel une modification en conflit est propagée.
@subscriber_db
sysname
Nom de la base de données depuis laquelle la modification en conflit est propagée.
@log_conflict OUTPUT
int
Indique 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 passées par l'Agent de fusion à ces paramètres pour implémenter votre logique de résolution des conflits personnalisée. Elle doit retourner un jeu de résultats d'une seule ligne dont la structure est identique à 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.
Pour utiliser un outil personnalisé de résolution des conflits avec un nouvel article de table
- Exécutez sp_addmergearticle pour définir un article, en affectant la valeur du programme de résolution des procédures stockées Microsoft SQLServer au paramètre @article_resolver et le nom de la procédure stockée qui implémente la logique de l'outil de résolution des conflits au paramètre @resolver_info. Pour plus d'informations, consultez Définir un article.
Pour utiliser un outil personnalisé de résolution des conflits avec un article de table existant
Exécutez sp_changemergearticle, en spécifiant @publication, @article, en affectant la valeur article_resolver à @property et la valeur du programme de résolution des procédures stockées Microsoft SQLServer à @value.
Exécutez sp_changemergearticle, en spécifiant @publication, @article, en affectant la valeur resolver_info à @property et 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.
[Haut de la page]
Programme 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++. Un outil de résolution des conflits personnalisé 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 contenant 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é à l'aide de 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 déjà 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_clsid et affectez la valeur false à @is_dotnet_assembly.
[!REMARQUE]
Lorsque vous n'en avez plus besoin, vous pouvez annuler l'enregistrement d'un outil de résolution des conflits personnalisé à l'aide de sp_unregistercustomresolver (Transact-SQL).
(Facultatif) Sur un cluster, répétez les étapes 5 à 8 pour enregistrer le programme de résolution personnalisé sur tous les nœuds du cluster. Cette procédure est nécessaire pour garantir que le programme de résolution personnalisé sera en mesure de 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 la valeur article_resolver à @property et le nom convivial du programme de résolution d'articles obtenu à l'étape 1 à @value.
[Haut de la page]
Affichage d'un exemple de programme de résolution personnalisé
Un exemple est disponible dans les exemples de fichiers SQL Server 2000. Téléchargez le fichier sql2000samples.cab depuis la page Exemples mis à jour de SQL Server 2000 Service Pack 3. Vous téléchargez ainsi 8 fichiers représentant au total 6,9 Mo.
Extrayez les fichiers à partir du fichier .cab compressé que vous avez téléchargé.
Exécutez setup.exe
[!REMARQUE]
Au moment de choisir les options d'installation, il est seulement nécessaire d'installer les exemples de réplication. (Le chemin d'installation par défaut est C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\)
Accédez au dossier d'installation. (Le dossier par défaut est C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)
Exécutez le programme unzip_sqlreplSP3.exe.
[!REMARQUE]
L'exemple de programme de résolution COM est installé (par défaut) dans le dossier C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres.
Dans le dossier subspres, recherchez toutes les occurrences de #include sqlres.h dans l'ensemble des fichiers sources et remplacez-les par #import "replrec.dll" no_namespace, raw_interfaces_only
Voir aussi
Concepts
Détection et résolution avancées des conflits de réplication de fusion