Vorgehensweise: Implementieren eines auf gespeicherten Prozeduren basierenden benutzerdefinierten Konfliktlösers für einen Mergeartikel (Replikationsprogrammierung)
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.
Hinweis |
---|
Microsoft SQL Server gespeicherte Prozedur Konfliktlöser werden aufgerufen, um Zeile Änderungsbasierte Konflikte nur zu behandeln. 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
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.
Gewähren 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 des Werts MicrosoftSQL Server Stored Procedure Resolver 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 Vorgehensweise: Definieren eines Artikels (Replikationsprogrammierung mit Transact-SQL).
So verwenden Sie einen benutzerdefinierten Konfliktlöser für einen vorhandenen Tabellenartikel
Führen Sie sp_changemergearticle aus, wobei Sie @publication, @article, den Wert article_resolver für @property und den WertMicrosoftSQL Server Stored ProcedureResolver für @value angeben.
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.