Vorgehensweise: Implementieren eines COM-basierten benutzerdefinierten Konfliktlösers für einen Mergeartikel (Replikationsprogrammierung)
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. Weitere Informationen finden Sie unter Vorgehensweise: Implementieren eines Geschäftslogikhandlers für einen Mergeartikel (Replikationsprogrammierung). Sie können auch eine eigene, auf systemeigenem Code basierende benutzerdefinierte Geschäftslogik zur Lösung von Konflikten schreiben. Diese Logik wird mithilfe von Produkten wie Microsoft Visual C++ als COM-Komponente konzipiert und in DLLs (Dynamic-Link Libraries) kompiliert. Ein solcher COM-basierter benutzerdefinierter Konfliktlöser muss die ICustomResolver-Schnittstelle implementieren, die speziell für die Konfliktlösung entworfen wurde.
So erstellen und registrieren Sie einen COM-basierten benutzerdefinierten Konfliktlöser
Fügen Sie in einer COM-kompatiblen Erstellungsumgebung Verweise auf die benutzerdefinierte Konfliktlöserbibliothek hinzu.
Verwenden Sie für ein Visual C++-Projekt die #import-Direktive, um diese Bibliothek in Ihr Projekt zu importieren.
Fügen Sie eine Klasse hinzu, die die ICustomResolver-Schnittstelle implementiert.
Implementieren Sie bestimmte Methoden und Eigenschaften.
Erstellen Sie das Projekt, um die benutzerdefinierte Konfliktlöserbibliotheksdatei zu erstellen.
Stellen Sie die Bibliothek in dem Verzeichnis bereit, das die ausführbare Datei des Merge-Agents (normalerweise \Microsoft SQL Server\100\COM) enthält.
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.
Registrieren Sie die benutzerdefinierte Konfliktlöserbibliothek folgendermaßen mit regsvr32.exe vom Bereitstellungsverzeichnis aus:
regsvr32.exe mycustomresolver.dll
Führen Sie auf dem Verleger sp_enumcustomresolvers (Transact-SQL) aus, um zu prüfen, ob die Bibliothek noch nicht als benutzerdefinierter Konfliktlöser registriert wurde.
Um die Bibliothek als benutzerdefinierten Konfliktlöser zu registrieren, führen Sie auf dem Verteiler sp_registercustomresolver (Transact-SQL) aus. 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.
Hinweis Wenn er nicht mehr benötigt wird, kann die Registrierung eines benutzerdefinierten Konfliktlösers mit sp_unregistercustomresolver (Transact-SQL) aufgehoben werden.
(Optional) Wiederholen Sie bei einem Cluster die Schritte 5 bis 8, um den benutzerdefinierten Konfliktlöser auf allen Knoten des Clusters zu registrieren. Dies ist erforderlich, um sicherzustellen, dass der benutzerdefinierte Konfliktlöser nach einem Failover die Synchronisierung korrekt laden kann.
So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem neuen Tabellenartikel
Führen Sie auf dem Verleger sp_enumcustomresolvers (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus, um einen Artikel zu definieren. Geben Sie den Anzeigenamen des Artikelkonfliktlösers aus Schritt 1 für @article_resolver an. Weitere Informationen finden Sie unter Vorgehensweise: Definieren eines Artikels (Replikationsprogrammierung mit Transact-SQL).
So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen Tabellenartikel
Führen Sie auf dem Verleger sp_enumcustomresolvers (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.
Führen Sie sp_changemergearticle (Transact-SQL) aus, und 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.