Implementeer een aangepaste conflictoplosser voor een Merge-artikel

Van toepassing op:SQL Server

Dit onderwerp beschrijft hoe je een aangepaste conflictoplosser voor een Merge-artikel in SQL Server kunt implementeren door gebruik te maken van Transact-SQL of een op COM gebaseerde aangepaste resolver.

Transact-SQL gebruiken

Je kunt je eigen aangepaste conflictoplosser schrijven als een Transact-SQL opgeslagen procedure bij elke Publisher. Tijdens synchronisatie wordt deze opgeslagen procedure aangeroepen wanneer conflicten voorkomen in een artikel waarop de resolver is geregistreerd. Informatie over de conflictreeks wordt door de Merge Agent doorgegeven aan de vereiste parameters van de procedure. Op stored procedures gebaseerde aangepaste conflictoplossers worden altijd aangemaakt op de Publisher.

Note

Microsoft SQL Server stored procedure-resolvers worden alleen aangeroepen om conflicten op basis van rijwijzigingen af te handelen. Ze kunnen niet worden gebruikt om andere soorten conflicten af te handelen, zoals insert-fouten veroorzaakt door PRIMARY KEY-overtredingen of overtredingen van unieke indexbeperkingen.

Om een op opgeslagen procedures gebaseerde aangepaste conflictoplosser te maken

  1. Maakt bij de Publisher in de publicatie- of msdb-database een nieuwe systeemopgeslagen procedure aan die de volgende vereiste parameters implementeert:

    Parameter Gegevenstype Description
    @tableowner sysname Naam van de eigenaar van de tabel waarvoor een conflict wordt opgelost. Dit is de eigenaar van de tabel in de publicatiedatabase.
    @tablename sysname Naam van de tabel waarvoor een conflict wordt opgelost.
    @rowguid uniqueidentifier Unieke identificatie voor de rij waarin het conflict zit.
    @subscriber sysname Naam van de server van waaruit een conflicterende wijziging wordt verspreid.
    @subscriber_db sysname Naam van de database waaruit een conflicterende wijziging wordt voortgezet.
    @log_conflict OUTPUT int Bepaalt of het mergeproces een conflict moet loggen voor latere oplossing:

    0 = Log het conflict niet.

    1 = De abonnee is de verliezer van het conflict.

    2 = Uitgever is de verliezer van het conflict.
    @conflict_message OUTPUT nvarchar(512) Er moet een boodschap worden gegeven over de oplossing als het conflict wordt geregistreerd.
    @destowner sysname De eigenaar van de gepubliceerde tabel van de Abonnee.

    Deze opgeslagen procedure gebruikt de waarden die door de Merge Agent aan deze parameters worden doorgegeven om je aangepaste conflictoplossingslogica te implementeren. Het moet een enkele rijresultaatset teruggeven die qua structuur identiek is aan de basistabel en die de datawaarden bevat voor de winnende versie van de rij.

  2. Verleen uitvoeringsrechten op de opgeslagen procedure aan alle logins die door abonnees worden gebruikt om verbinding te maken met de Publisher.

Gebruik een aangepaste conflictoplosser met een nieuw tabelartikel

  1. Voer sp_addmergearticle uit om een artikel te definiëren.

  2. Specificeer een waarde van MicrosoftSQLServer Stored Procedure Resolver voor de @article_resolver parameter.

  3. Geef de naam aan van de opgeslagen procedure die de conflictresolverlogica voor de @resolver_info parameter implementeert.

    Voor meer informatie, zie Definieer een artikel.

Om een aangepaste conflictoplosser te gebruiken met een bestaand tabelartikel

  1. Voer sp_changemergearticle uit, waarbij @publication, @article, een waarde van article_resolver voor @property en een waarde van MicrosoftSQLServer Stored ProcedureResolver voor @value wordt gespecificeerd.

  2. Voer sp_changemergearticle uit, waarbij je @publication, @article, een waarde van resolver_info voor @property en de naam van de opgeslagen procedure die de conflictoplosser logica voor @value implementeert, specificeert.

Gebruik van een COM-gebaseerde custom resolver

De Microsoft.SqlServer.Replication.BusinessLogicSupport naamruimte implementeert een interface waarmee je complexe bedrijfslogica kunt schrijven om gebeurtenissen af te handelen en conflicten op te lossen die optreden tijdens het Merge replicatie-synchronisatieproces. Raadpleeg Een bedrijfslogica-handler implementeren voor een samenvoegartikel voor meer informatie. Je kunt ook je eigen native code-gebaseerde bedrijfslogica schrijven om conflicten op te lossen. Deze logica wordt gebouwd als een COM-component en gecompileerd in dynamic-link libraries (DLL's), met producten zoals Microsoft Visual C++. Dit type COM-gebaseerde aangepaste conflictoplosser moet de ICustomResolver-interface implementeren, die specifiek is ontworpen voor conflictoplossing.

Om een COM-gebaseerde aangepaste conflictoplosser te maken en te registreren

  1. Voeg in een COM-compatibele authoring-omgeving referenties toe aan de Custom Conflict Resolver-bibliotheek.

  2. Voor een Visual C++-project gebruik je de #import-richtlijn om deze bibliotheek in je project te importeren.

  3. Maak een klasse aan die de ICustomResolver-interface implementeert.

  4. Implementeer bepaalde methoden en eigenschappen.

  5. Compileer het project om het bibliotheekbestand voor de aangepaste conflictoplosser te maken.

  6. Deploy de bibliotheek in de map die het uitvoerbare bestand van de Merge Agent bevat (meestal \Microsoft SQL Server\100\COM).

    Note

    Een aangepaste conflictoplosser moet worden ingezet bij de abonnee voor een pull-abonnement, bij de distributeur voor een push-abonnement, of bij de webserver die wordt gebruikt voor websynchronisatie.

  7. Registreer de aangepaste conflictoplosserbibliotheek door regsvr32.exe uit de deploymentdirectory als volgt uit te voeren:

    regsvr32.exe mycustomresolver.dll  
    
  8. Voer Publisher sp_enumcustomresolvers uit (Transact-SQL) om te verifiëren dat de bibliotheek niet al geregistreerd is als een aangepaste conflictoplosser.

  9. Om de bibliotheek als aangepaste conflictoplosser te registreren, voer je sp_registercustomresolver (Transact-SQL) uit bij de Distributeur. Geef de vriendelijke naam van het COM-object op voor @article_resolver, de ID (CLSID) van de bibliotheek voor @resolver_clsid, en een waarde false voor@is_dotnet_assembly.

    Note

    Wanneer het niet meer nodig is, kun je een aangepaste conflictoplosser verwijderen door sp_unregistercustomresolver (Transact-SQL) te gebruiken.

  10. (Optioneel) Herhaal op een cluster stappen 6-9 om de aangepaste resolver op alle nodes van de cluster te registreren. Deze stappen zijn nodig om ervoor te zorgen dat de aangepaste resolver de reconciler correct kan laden na een failover.

Om een aangepaste conflictoplosser te gebruiken met een nieuw tabelartikel

  1. Voer Publisher sp_enumcustomresolvers (Transact-SQL) uit en noteer de vriendelijke naam van de gewenste resolver.

  2. Voer Publisher in de publicatiedatabase sp_addmergearticle (Transact-SQL) uit om een artikel te definiëren. Specificeer de vriendelijke naam van de artikelresolver vanaf stap 1 voor @article_resolver. Voor meer informatie, zie Definieer een artikel.

Om een aangepaste conflictoplosser te gebruiken met een bestaand tabelartikel

  1. Voer Publisher sp_enumcustomresolvers (Transact-SQL) uit en noteer de vriendelijke naam van de gewenste resolver.

  2. Voer sp_changemergearticle uit (Transact-SQL), waarbij @publication, @article, een waarde van article_resolver voor @property en de vriendelijke naam van de artikelresolver uit stap 1 voor @value worden gespecificeerd.