Implementieren eines benutzerdefinierten Konfliktlösers für einen MergeartikelImplement a custom conflict resolver for a Merge article

Gilt für: JaSQL Server NeinAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

In diesem Thema wird beschrieben, wie ein benutzerdefinierter Konfliktlöser für einen Mergeartikel mit Transact-SQLTransact-SQL oder einem COM-basierten benutzerdefinierten Konfliktlöser in SQL ServerSQL Server implementiert wird.This topic describes how to implement a custom conflict resolver for a Merge article in SQL ServerSQL Server by using Transact-SQLTransact-SQL or a COM-based custom resolver.

In diesem ThemaIn this topic

Verwenden von Transact-SQLUsing Transact-SQL

Sie können einen eigenen benutzerdefinierten Konfliktlöser als gespeicherte Transact-SQLTransact-SQL -Prozedur in einem Verleger schreiben.You can write your own custom conflict resolver as a Transact-SQLTransact-SQL stored procedure at each Publisher. Während der Synchronisierung wird diese gespeicherte Prozedur aufgerufen, wenn in einem Artikel, bei dem der Konfliktlöser registriert wurde, Konflikte auftreten.During synchronization, this stored procedure is invoked when conflicts are encountered in an article that the resolver was registered to. Informationen zur Konfliktzeile werden vom Merge-Agent an die erforderlichen Parameter der Prozedur übermittelt.Information about the conflict row is passed by the Merge Agent to the required parameters of the procedure. Auf gespeicherten Prozeduren basierende benutzerdefinierte Konfliktlöser werden immer auf dem Verleger erstellt.Stored procedure-based custom conflict resolvers are always created at the Publisher.

Hinweis

MicrosoftMicrosoft SQL ServerSQL Server-Konfliktlöser für gespeicherte Prozeduren werden nur zur Behandlung änderungsbasierter Konflikte auf Zeilenebene aufgerufen.SQL ServerSQL Server stored procedure resolvers are invoked only to handle row change-based conflicts. Sie können nicht zur Behandlung anderer Arten von Konflikten verwendet werden, z. B. von Einfügefehlern, die durch den Verstoß gegen eine PRIMARY KEY-Einschränkung oder einen eindeutigen Index ausgelöst werden.They can't be used to handle other types of conflicts like insert failures triggered by PRIMARY KEY violations or unique index constraint violations.

So erstellen und registrieren Sie einen auf gespeicherten Prozeduren basierenden benutzerdefinierten KonfliktlöserTo create a stored procedure-based custom conflict resolver

  1. Erstellen Sie auf dem Verleger entweder in der Veröffentlichungs- oder der msdb -Datenbank eine neue gespeicherte Systemprozedur, welche die folgenden erforderlichen Parameter implementiert:At the Publisher in either the publication or msdb database, create a new system stored procedure that implements the following required parameters:

    ParameterParameter DatentypData type und BeschreibungDescription
    @tableowner@tableowner sysnamesysname Name des Besitzers der Tabelle, für die ein Konflikt gelöst wird.Name of the owner of the table for which a conflict is being resolved. Dies ist der Besitzer der Tabelle der Veröffentlichungsdatenbank.This is the owner for the table in the publication database.
    @tablename@tablename sysnamesysname Name der Tabelle, für die ein Konflikt gelöst wird.Name of the table for which a conflict is being resolved.
    @rowguid@rowguid uniqueidentifieruniqueidentifier Eindeutiger Bezeichner für die Zeile, in der der Konflikt auftritt.Unique identifier for the row that has the conflict.
    @subscriber@subscriber sysnamesysname Name des Servers, von dem eine konfliktverursachende Änderung weitergegeben wird.Name of the server from which a conflicting change is being propagated.
    @subscriber_db@subscriber_db sysnamesysname Name der Datenbank, von der eine konfliktverursachende Änderung weitergegeben wird.Name of the database from which a conflicting change is being propagated.
    @log_conflict OUTPUT@log_conflict OUTPUT intint Legt fest, ob der Mergeprozess einen Konflikt für eine spätere Auflösung protokollieren soll:Sets whether the merge process should log a conflict for later resolution:

    0 = Den Konflikt nicht protokollieren.0 = Do not log the conflict.

    1 = Der Abonnent verliert den Konflikt.1 = Subscriber is the conflict loser.

    2 = Der Verleger verliert den Konflikt.2 = Publisher is the conflict loser.
    @conflict_message OUTPUT@conflict_message OUTPUT nvarchar(512)nvarchar(512) Meldung, die über die Auflösung ausgegeben werden soll, wenn der Konflikt protokolliert wird.Message to be given about the resolution if the conflict is logged.
    @destowner@destowner sysnamesysname Der Besitzer der auf dem Abonnenten veröffentlichten Tabelle.The owner of the published table at the Subscriber.

    Diese gespeicherte Prozedur verwendet die Werte, die vom Merge-Agent an diese Parameter übermittelt werden, um die benutzerdefinierte Konfliktlösungslogik zu implementieren.This stored procedure uses the values passed by the Merge Agent to these parameters to implement your custom conflict resolution logic. Sie muss ein einzelnes Zeilenresultset zurückgeben, das in der Struktur mit der Basistabelle identisch ist und die Datenwerte für die gewinnende Version der Zeile enthält.It must return a single row result set that's identical in structure to the base table and that contains the data values for the winning version of the row.

  2. Gewähren Sie allen Anmeldungen, die von Abonnenten zum Verbindungsaufbau mit dem Verleger verwendet werden, EXECUTE-Berechtigungen für die gespeicherte Prozedur.Grant EXECUTE permissions on the stored procedure to any logins used by Subscribers to connect to the Publisher.

Verwenden eines benutzerdefinierten Konfliktlösers mit einem neuen TabellenartikelUse a custom conflict resolver with a new table article

  1. Führen Sie sp_addmergearticle aus, um einen Artikel zu definieren.Execute sp_addmergearticle to define an article.

  2. Geben Sie einen Wert des MicrosoftSQL Server Stored Procedure Resolver für den @article_resolver-Parameter an.Specify a value of MicrosoftSQL Server Stored Procedure Resolver for the @article_resolver parameter.

  3. Geben Sie den Namen der gespeicherten Prozedur an, mit der die Konfliktlöserlogik für den @resolver_info-Parameter implementiert wird.Specify the name of the stored procedure that implements the conflict resolver logic for the @resolver_info parameter.

    Weitere Informationen finden Sie unter Definieren eines Artikels.For more information, see Define an article.

So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen TabellenartikelTo use a custom conflict resolver with an existing table article

  1. Führen Sie sp_changemergearticle aus, wobei Sie @publication, @article, den Wert article_resolver für @propertyund einen Wert des MicrosoftSQL-Konfliktlösers für gespeicherte Prozeduren für @value angeben.Execute sp_changemergearticle, specifying @publication, @article, a value of article_resolver for @property, and a value of MicrosoftSQL Server Stored ProcedureResolver for @value.

  2. Führen Sie sp_changemergearticle aus, wobei Sie @publication, @article, den Wert resolver_info für @property und den Namen der gespeicherten Prozedur, mit der die Konfliktlöserlogik implementiert wird, für @value angeben.Execute sp_changemergearticle, specifying @publication, @article, a value of resolver_info for @property, and the name of the stored procedure that implements the conflict resolver logic for @value.

Verwenden eines COM-basierten benutzerdefinierten KonfliktlösersUsing a COM-based custom resolver

Der Microsoft.SqlServer.Replication.BusinessLogicSupport -Namespace implementiert eine Schnittstelle, mit der Sie eine komplexe Geschäftslogik zum Verarbeiten von Ereignissen und zur Lösung von Konflikten schreiben können, die während der Synchronisierung der Mergereplikation eintreten.The Microsoft.SqlServer.Replication.BusinessLogicSupport namespace implements an interface that enables you to write complex business logic to handle events and to resolve conflicts that occur during the Merge replication synchronization process. Weitere Informationen finden Sie unter Implementieren eines Geschäftslogikhandlers für einen Mergeartikel.For more information, see Implement a Business Logic Handler for a Merge article. Sie können auch eine eigene, auf systemeigenem Code basierende benutzerdefinierte Geschäftslogik zur Lösung von Konflikten schreiben.You can also write your own native code-based custom business logic to resolve conflicts. Diese Logik wird mithilfe von Produkten wie MicrosoftMicrosoft Visual C++ als COM-Komponente konzipiert und in DLLs (Dynamic-Link Libraries) kompiliert.This logic is built as a COM component and compiled into dynamic-link libraries (DLLs), using products such as MicrosoftMicrosoft Visual C++. Ein solcher COM-basierter benutzerdefinierter Konfliktlöser muss die ICustomResolver-Schnittstelle implementieren, die speziell für die Konfliktlösung entworfen wurde.This kind of COM-based custom conflict resolver must implement the ICustomResolver interface, which is designed specifically for conflict resolution.

So erstellen und registrieren Sie einen COM-basierten benutzerdefinierten KonfliktlöserTo create and register a COM-based custom conflict resolver

  1. Fügen Sie in einer COM-kompatiblen Erstellungsumgebung Verweise auf die benutzerdefinierte Konfliktlöserbibliothek hinzu.In a COM-compatible authoring environment, add references to the Custom Conflict Resolver library.

  2. Verwenden Sie für ein Visual C++-Projekt die #import-Direktive, um diese Bibliothek in Ihr Projekt zu importieren.For a Visual C++ project, use the #import directive to import this library into your project.

  3. Fügen Sie eine Klasse hinzu, die die ICustomResolver -Schnittstelle implementiert.Create a class that implements the ICustomResolver interface.

  4. Implementieren Sie bestimmte Methoden und Eigenschaften.Implement certain methods and properties.

  5. Erstellen Sie das Projekt, um die benutzerdefinierte Konfliktlöserbibliotheksdatei zu erstellen.Build the project to create the custom conflict resolver library file.

  6. Stellen Sie die Bibliothek in dem Verzeichnis bereit, das die ausführbare Datei des Merge-Agent (normalerweise \Microsoft SQL Server\100\COM) enthält.Deploy the library in the directory that contains the Merge Agent executable (usually \Microsoft SQL Server\100\COM).

    Hinweis

    Ein benutzerdefinierter Konfliktlöser muss bei einem Pullabonnement auf dem Abonnenten, bei einem Pushabonnement auf dem Verteiler oder auf dem mit der Websynchronisierung verwendeten Webserver bereitgestellt werden.A custom conflict resolver must be deployed at the Subscriber for a pull subscription, at the Distributor for a push subscription, or at the Web server used with Web synchronization.

  7. Registrieren Sie die benutzerdefinierte Konfliktlöserbibliothek folgendermaßen mit „regsvr32.exe“ vom Bereitstellungsverzeichnis aus:Register the custom conflict resolver library by running regsvr32.exe from the deployment directory as follows:

    regsvr32.exe mycustomresolver.dll  
    
  8. Führen Sie auf dem Herausgeber sp_enumcustomresolvers (Transact-SQL) aus, um zu prüfen, ob die Bibliothek noch nicht als benutzerdefinierter Konfliktlöser registriert wurde.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) to verify that the library isn't already registered as a custom conflict resolver.

  9. Um die Bibliothek als benutzerdefinierten Konfliktlöser zu registrieren, führen Sie auf dem Verteiler sp_registercustomresolver (Transact-SQL) aus.To register the library as a custom conflict resolver, execute sp_registercustomresolver (Transact-SQL) at the Distributor. Geben Sie den Anzeigenamen des COM-Objekts für @article_resolver, die Bibliotheks-ID (CLSID) für @resolver_clsid und den Wert FALSE für @is_dotnet_assembly an.Specify the friendly name of the COM object for @article_resolver, the library's ID (CLSID) for @resolver_clsid, and a value of false for @is_dotnet_assembly.

    Hinweis

    Wenn er nicht mehr benötigt wird, können Sie die Registrierung eines benutzerdefinierten Konfliktlösers mit sp_unregistercustomresolver (Transact-SQL) aufheben.When it's no longer needed, you can unregister a custom conflict resolver by using sp_unregistercustomresolver (Transact-SQL).

  10. (Optional) Wiederholen Sie bei einem Cluster die Schritte 6-9, um den benutzerdefinierten Konfliktlöser auf allen Knoten des Clusters zu registrieren.(Optional) On a cluster, repeat steps 6-9 to register the custom resolver on all nodes of the cluster. Diese Schritte sind erforderlich, um sicherzustellen, dass der benutzerdefinierte Konfliktlöser nach einem Failover die Synchronisierung korrekt laden kann.These steps are required to make sure that the custom resolver can properly load the reconciler following a failover.

So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem neuen TabellenartikelTo use a custom conflict resolver with a new table article

  1. Führen Sie auf dem Herausgeber sp_unregistercustomresolver (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL), and note the friendly name of the desired resolver.

  2. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) zur Definition eines Artikels aus.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define an article. Geben Sie den Anzeigenamen des Artikelkonfliktlösers aus Schritt 1 für @article_resolver an.Specify the friendly name of the article resolver from step 1 for @article_resolver. Weitere Informationen finden Sie unter Definieren eines Artikels.For more information, see Define an article.

So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen TabellenartikelTo use a custom conflict resolver with an existing table article

  1. Führen Sie auf dem Herausgeber sp_unregistercustomresolver (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL), and note the friendly name of the desired resolver.

  2. Führen Sie sp_changemergearticle (Transact-SQL) aus. Geben Sie dabei @publication , @article, den Wert article_resolver für @property und den Anzeigenamen des Artikelkonfliktlösers aus Schritt 1 für @value an.Execute sp_changemergearticle (Transact-SQL), specifying @publication, @article, a value of article_resolver for @property, and the friendly name of the article resolver from step 1 for @value.

Siehe auchSee also

Erweiterte Konflikterkennung und -lösung der Mergereplikation Advanced Merge replication conflict detection and resolution
COM-basierte, benutzerdefinierte Konfliktlöser COM-based custom resolvers
Bewährte Methoden für die ReplikationssicherheitReplication security best practices