Implémenter un outil personnalisé de résolution des conflits pour un article de fusion

Cette rubrique explique comment implémenter un programme de résolution de conflit personnalisé pour un article de fusion dans SQL Server 2014 à l’aide de Transact-SQL ou d’un programme de résolution personnalisé basé sur COM.

Dans cette rubrique

Utilisation de Transact-SQL

Vous pouvez écrire votre propre programme de résolution des conflits personnalisé en tant que procédure stockée Transact-SQL sur 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.

Notes

Les résolveurs de procédures stockées Microsoft SQL Server sont uniquement appelés pour gérer les conflits basés sur les modifications 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

  1. 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.

  2. 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 de résolution des conflits personnalisé avec un nouvel article de table

  1. 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 de résolution des conflits personnalisé avec un article de table existant

  1. Exécutez sp_changemergearticle, en spécifiant @publication, @article, une valeur de article_resolver pour @property et une valeur de MicrosoftSQLServer Stored ProcedureResolver pour @value.

  2. 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.

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, voir 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 générée en tant que composant COM et compilée en bibliothèques de liens dynamiques (DLL), à l’aide de produits tels que Microsoft Visual C++. Ce programme de résolution de 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

  1. 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é.

  2. Pour un projet Visual C++, utilisez la directive #import pour importer cette bibliothèque dans votre projet.

  3. Créez une classe qui implémente l'interface ICustomResolver .

  4. Implémentez certaines méthodes et propriétés.

  5. Générez le projet de manière à créer le fichier bibliothèque de l'outil de résolution des conflits personnalisé.

  6. 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).

    Notes

    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.

  7. 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  
    
  8. Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) pour vérifier que la bibliothèque n’est pas déjà inscrite en tant que programme de résolution de conflit personnalisé.

  9. Pour inscrire la bibliothèque en tant que programme de résolution de conflit personnalisé, exécutez sp_registercustomresolver (Transact-SQL) sur le serveur de distribution. Spécifiez le nom convivial de l’objet COM pour @article_resolver, l’ID (CLSID) de la bibliothèque pour @resolver_clsid et la valeur pour false@is_dotnet_assembly.

    Notes

    Lorsque vous n’en avez plus besoin, un programme de résolution de conflit personnalisé peut être désinscrit à l’aide de sp_unregistercustomresolver (Transact-SQL).

  10. (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

  1. Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) et notez le nom convivial du programme de résolution souhaité.

  2. Sur la base de données de publication du 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

  1. Sur le serveur de publication, exécutez sp_enumcustomresolvers (Transact-SQL) et notez le nom convivial du programme de résolution souhaité.

  2. Exécutez sp_changemergearticle (Transact-SQL) en spécifiant @publication, @article, la valeur article_resolver pour @property et le nom convivial du programme de résolution d’articles de l’étape 1 pour @value.

Affichage d'un exemple de programme de résolution personnalisé

  1. Un exemple est disponible dans les fichiers d'exemple de SQL Server 2000. Téléchargez le sql2000samples.zip. Cette opération télécharge 3 fichiers d’une taille de 6,9 Mo.

  2. Extrayez les fichiers du fichier .cab compressé téléchargé.

  3. Exécuter setup.exe

    Notes

    Lorsque vous choisissez les options d'installation, il est uniquement 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\)

  4. Accédez au dossier d'installation. (Le dossier par défaut est le suivant : C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)

  5. Exécutez le programme unzip_sqlreplSP3.exe .

    Notes

    L’exemple de programme de résolution COM s’installe (par défaut) dans le dossier suivant : C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres .

  6. Dans le dossier subspres , recherchez toutes les occurrences de l’élément #include sqlres.h dans l’ensemble des fichiers sources, et remplacez-les par #import "replrec.dll" no_namespace, raw_interfaces_only.

Voir aussi

Advanced Merge Replication Conflict Detection and Resolution
Résolveurs personnalisés basés sur COM
Bonnes pratiques en matière de sécurité de la réplication