Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
In diesem Thema wird beschrieben, wie ein benutzerdefinierter Konfliktlöser für einen Mergeartikel mit Transact-SQL oder einem COM-basierten benutzerdefinierten Konfliktlöser in SQL Server implementiert wird.
Verwenden von Transact-SQL
Sie können bei jedem Publisher einen benutzerdefinierten Konfliktlöser als gespeicherte Transact-SQL-Prozedur schreiben. Während der Synchronisierung wird diese gespeicherte Prozedur aufgerufen, wenn in einem Artikel, bei dem der Konfliktlöser registriert wurde, Konflikte auftreten. Informationen zur Konfliktzeile werden vom Merge-Agent an die erforderlichen Parameter der Prozedur übermittelt. Benutzerdefinierte Konfliktlöser auf Basis gespeicherter Prozeduren werden immer beim Publisher erstellt.
Hinweis
Microsoft SQL Server -Konfliktlöser für gespeicherte Prozeduren werden nur zur Behandlung änderungsbasierter Konflikte auf Zeilenebene aufgerufen. 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.
Erstellen eines benutzerdefinierten, auf einer gespeicherten Prozedur basierenden Konfliktauflösers
Erstellen Sie beim Verleger entweder in der Publikationsdatenbank oder in der msdb-Datenbank eine neue gespeicherte Systemprozedur, die die folgenden erforderlichen Parameter implementiert:
Parameter Datentyp Beschreibung @tableowner sysname Name des Besitzers der Tabelle, für die ein Konflikt gelöst wird. Dies ist der Besitzer der Tabelle der Veröffentlichungsdatenbank. @tablename sysname Name der Tabelle, für die ein Konflikt gelöst wird. @rowguid uniqueidentifier Eindeutiger Bezeichner für die Zeile, in der der Konflikt auftritt. @subscriber sysname Name des Servers, von dem eine konfliktverursachende Änderung weitergegeben wird. @subscriber_db sysname Name der Datenbank, von der eine konfliktverursachende Änderung weitergegeben wird. @log_conflict AUSGABE int Legt fest, ob der Mergeprozess einen Konflikt für eine spätere Auflösung protokollieren soll:
0 = Den Konflikt nicht protokollieren.
1 = Der Abonnent verliert den Konflikt.
2 = Der Verleger verliert den Konflikt.@conflict_message AUSGABE nvarchar(512) Meldung, die über die Auflösung ausgegeben werden soll, wenn der Konflikt protokolliert wird. @destowner sysname Der Besitzer der auf dem Abonnenten veröffentlichten Tabelle. Diese gespeicherte Prozedur verwendet die Werte, die vom Merge-Agent an diese Parameter übermittelt werden, um die benutzerdefinierte Konfliktlösungslogik zu implementieren. 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.
Gewähren Sie allen Anmeldungen, die von Abonnenten zum Verbindungsaufbau mit dem Verleger verwendet werden, EXECUTE-Berechtigungen für die gespeicherte Prozedur.
Verwenden eines benutzerdefinierten Konfliktlösers mit einem neuen Tabellenartikel
Führen Sie sp_addmergearticle aus, um einen Artikel zu definieren.
Geben Sie den Wert MicrosoftSQLServer Stored Procedure Resolver für den Parameter @article_resolver an.
Geben Sie den Namen der gespeicherten Prozedur an, mit der die Konfliktlöserlogik für den @resolver_info-Parameter implementiert wird.
Weitere Informationen finden Sie unter Definieren eines Artikels.
So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen Tabellenartikel
Führen Sie sp_changemergearticle aus, wobei Sie @publication, @article, den Wert article_resolver für @property und den Wert MicrosoftSQLServer Stored ProcedureResolver für @value angeben.
Führen Sie sp_changemergearticleaus, wobei Sie @publication, @article, den Wert resolver_info für @propertyund den Namen der gespeicherten Prozedur, mit der die Konfliktlöserlogik implementiert wird, für @valueangeben.
Verwenden eines COM-basierten benutzerdefinierten Konfliktlösers
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 Implementieren eines Geschäftslogikhandlers für einen Mergeartikel. 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-Agent (normalerweise \Microsoft SQL Server\100\COM) enthält.
Hinweis
Ein benutzerdefinierter Konfliktauflöser muss für ein Pullabonnement auf dem Abonnenten, für ein Pushabonnement auf dem Verteiler oder auf dem für die Websynchronisierung verwendeten Webserver bereitgestellt werden.
Registrieren Sie die benutzerdefinierte Konfliktlöserbibliothek folgendermaßen mit „regsvr32.exe“ vom Bereitstellungsverzeichnis aus:
regsvr32.exe mycustomresolver.dllFü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.
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_clsidund den Wert false für @is_dotnet_assemblyan.
Hinweis
Wenn er nicht mehr benötigt wird, können Sie die Registrierung eines benutzerdefinierten Konfliktlösers mit sp_unregistercustomresolver (Transact-SQL) aufheben.
Optional: Wiederholen Sie in einem Cluster die Schritte 6–9, um den benutzerdefinierten Resolver auf allen Knoten des Clusters zu registrieren. Diese Schritte sind erforderlich, um sicherzustellen, dass der benutzerdefinierte Resolver nach einem Failover den Reconciler ordnungsgemäß laden kann.
So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem neuen Tabellenartikel
Führen Sie auf dem Herausgeber sp_enumcustomresolvers (Transact-SQL) aus, und notieren Sie den Anzeigenamen des gewünschten Konfliktlösers.
Führen Sie beim Publisher in der Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus, um einen Artikel zu definieren. Geben Sie den Anzeigenamen des Artikelauflösers aus Schritt 1 für
@article_resolver an. Weitere Informationen finden Sie unter Definieren eines Artikels.
So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen Tabellenartikel
Führen Sie auf dem Herausgeber sp_enumcustomresolvers (Transact-SQL) aus, und notieren Sie 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 sowie den Anzeigenamen des Artikelresolvers aus Schritt 1 für @value an.