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

S’applique à :SQL Server

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

Dans cette rubrique

Utilisation de Transact-SQL

Vous pouvez écrire votre propre programme de résolution de conflit personnalisé en tant que procédure stockée Transact-SQL sur 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 résolveurs de procédures stockées Microsoft SQL Server sont appelés uniquement 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 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

  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 à 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.
    sortie @log_conflict 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.
    sortie @conflict_message 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.

  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.

Utiliser un outil personnalisé de résolution des conflits avec un nouvel article de table

  1. Exécutez sp_addmergearticle pour définir un article.

  2. Spécifiez la valeur du programme de résolution de procédure stockée du serveur MicrosoftSQLpour le paramètre @article_resolver.

  3. Spécifiez le nom de la procédure stockée qui implémente la logique de résolution de conflit 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

  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.

Utilisation d’un 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 générée en tant que 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

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

  7. 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  
    
  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 de la bibliothèque (CLSID) pour @resolver_clsidet affectez la valeur false à @is_dotnet_assembly.

    Remarque

    Lorsqu’il n’est plus nécessaire, vous pouvez annuler l’inscription d’un programme de résolution de conflit personnalisé à l’aide de sp_unregistercustomresolver (Transact-SQL).

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

  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 le serveur de publication sur la base de données 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, une valeur de article_resolver pour @property et le nom convivial du programme de résolution d’article de l’étape 1 pour @value.

Voir aussi

Détection et résolution avancées des conflits de réplication de fusion
Résolveurs personnalisés COM
Bonnes pratiques en matière de sécurité de la réplication