Implementieren eines benutzerdefinierten Konfliktlösers für einen Mergeartikel

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 2012 implementiert wird.

In diesem Thema

  • So implementieren Sie einen benutzerdefinierten Konfliktlöser für einen Mergeartikel mit:

    Transact-SQL

    COM-basierter Konfliktlöser

Verwendung von Transact-SQL

Sie können einen eigenen benutzerdefinierten Konfliktlöser als gespeicherte Transact-SQL-Prozedur in einem Verleger schreiben. Diese gespeicherte Prozedur wird während der Synchronisierung aufgerufen, wenn in einem Artikel, für den der Konfliktlöser registriert wurde, Konflikte erkannt werden. Die Informationen zur Konfliktzeile werden vom Merge-Agent an die erforderlichen Parameter der Prozedur übergeben. Auf gespeicherten Prozeduren basierende benutzerdefinierte Konfliktlöser werden immer auf dem Verleger erstellt.

HinweisHinweis

MicrosoftSQL 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 verursacht werden.

So erstellen und registrieren Sie einen auf gespeicherten Prozeduren basierenden benutzerdefinierten Konfliktlöser

  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:

    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, die den Konflikt enthält.

    @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 OUTPUT

    int

    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 OUTPUT

    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 für diese Parameter übergeben werden, um die benutzerdefinierte Konfliktlöserlogik zu implementieren. Sie muss ein einzeiliges Resultset zurückgeben, dessen Struktur mit der Struktur der Basistabelle identisch ist, und das die Datenwerte für die gewinnende Version der Zeile enthält.

  2. Erteilen Sie allen Anmeldungen, die von Abonnenten zum Verbindungsaufbau mit dem Verleger verwendet werden, EXECUTE-Berechtigungen für die gespeicherte Prozedur.

So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem neuen Tabellenartikel

  • Führen Sie zur Definition eines Artikels sp_addmergearticle unter Angabe eines Werts des MicrosoftSQL Konfliktlösers für gespeicherte Prozeduren für den Parameter @article_resolver und des Namens der gespeicherten Prozedur, mit der die Konfliktlöserlogik implementiert wird, für den Parameter @resolver_info aus. Weitere Informationen finden Sie unter Definieren eines Artikels.

So verwenden Sie einen benutzerdefinierten Konfliktlöser für einen vorhandenen Tabellenartikel

  1. Führen Sie sp_changemergearticle aus, wobei Sie @publication, @article, den Wert article_resolver für @property und einen Wert des MicrosoftSQL Konfliktlösers für gespeicherte Prozeduren für @value angeben.

  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.

Pfeilsymbol, dass mit dem Link "Zurück zum Anfang" verwendet wird[Nach oben]

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

  1. Fügen Sie in einer COM-kompatiblen Erstellungsumgebung Verweise auf die benutzerdefinierte Konfliktlöserbibliothek hinzu.

  2. Verwenden Sie für ein Visual C++-Projekt die #import-Direktive, um diese Bibliothek in Ihr Projekt zu importieren.

  3. Fügen Sie eine Klasse hinzu, die die ICustomResolver-Schnittstelle implementiert.

  4. Implementieren Sie bestimmte Methoden und Eigenschaften.

  5. Erstellen Sie das Projekt, um die benutzerdefinierte Konfliktlöserbibliotheksdatei zu erstellen.

  6. Stellen Sie die Bibliothek in dem Verzeichnis bereit, das die ausführbare Datei des Merge-Agents (normalerweise \Microsoft SQL Server\100\COM) enthält.

    HinweisHinweis

    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.

  7. Registrieren Sie die benutzerdefinierte Konfliktlöserbibliothek folgendermaßen mit regsvr32.exe vom Bereitstellungsverzeichnis aus:

    regsvr32.exe mycustomresolver.dll
    
  8. 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.

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

    HinweisHinweis

    Wenn er nicht mehr benötigt wird, kann die Registrierung eines benutzerdefinierten Konfliktlösers mit sp_unregistercustomresolver (Transact-SQL) aufgehoben werden.

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

  1. Führen Sie auf dem Verleger sp_enumcustomresolvers (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.

  2. 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 Definieren eines Artikels.

So verwenden Sie einen benutzerdefinierten Konfliktlöser mit einem vorhandenen Tabellenartikel

  1. Führen Sie auf dem Verleger sp_enumcustomresolvers (Transact-SQL) aus, und achten Sie auf den Anzeigenamen des gewünschten Konfliktlösers.

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

Pfeilsymbol, dass mit dem Link "Zurück zum Anfang" verwendet wird[Nach oben]

Anzeigen eines Beispiels für einen benutzerdefinierten Konfliktlöser

  1. Sie finden ein Beispiel in den Beispieldateien zu SQL Server 2000. Laden Sie sql2000samples.cab von Aktualisierte Beispiele für SQL Server 2000 Service Pack 3 herunter. Der Download umfasst 6,9 MB, verteilt auf acht Dateien.

  2. Extrahieren Sie die Dateien aus der heruntergeladenen komprimierten CAB-Datei.

  3. Ausführen von setup.exe

    HinweisHinweis

    In den Installationsoptionen müssen nur die Beispiele für die Replikation aktiviert werden. (Der Standardinstallationspfad ist C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1031\.)

  4. Wechseln Sie zum Installationsordner. (Der Standardordner ist C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1031\sqlrepl\unzip_sqlreplSP3.exe.)

  5. Führen Sie das Programm unzip_sqlreplSP3.exe aus.

    HinweisHinweis

    Der im Beispiel verwendete COM-Konfliktlöser wird (standardmäßig) im Ordner C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1031\sqlrepl\resolver\subspres installiert.

  6. Suchen Sie im Ordner subspres in allen Quelldateien sämtliche Vorkommen von #include sqlres.h, und ersetzen Sie diese durch #import "replrec.dll" no_namespace, raw_interfaces_only.

Siehe auch

Konzepte

Erweiterte Konflikterkennung und -lösung bei der Mergereplikation

COM-basierte benutzerdefinierte Konfliktlöser

Bewährte Methoden für die Replikationssicherheit