Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Detta ämne beskriver hur man implementerar en anpassad konfliktlösare för en Merge-artikel i SQL Server genom att använda Transact-SQL eller en COM-baserad anpassad resolver.
Använda Transact-SQL
Du kan skriva din egen anpassade konfliktlösare som en Transact-SQL lagrad procedur vid varje Publisher. Under synkronisering anropas denna lagrade propus när konflikter uppstår i en artikel som resolvern var registrerad på. Information om konfliktraden skickas av Merge Agent till de nödvändiga parametrarna för proceduren. Lagrade procedurbaserade anpassade konfliktlösare skapas alltid hos Publisher.
Anmärkning
Microsoft SQL Server lagrade procedurlösare anropas endast för att hantera konflikter baserade på radbyte. De kan inte användas för att hantera andra typer av konflikter som insättningsfel som utlöses av PRIMÄRNYCKEL-överträdelser eller unika indexbegränsningar.
För att skapa en lagrad procedurbaserad anpassad konfliktlösare
På Publisher i antingen publikations- eller msdb-databasen, skapa en ny systemlagrad procedur som implementerar följande nödvändiga parametrar:
Parameter Datatyp Description @tableowner sysname Namn på ägaren till tabellen för vilken en konflikt löses. Detta är ägaren till tabellen i publikationsdatabasen. @tablename sysname Namnet på tabellen för vilken en konflikt löses. @rowguid uniqueidentifier Unik identifierare för raden som har konflikten. @subscriber sysname Namnet på servern från vilken en motstridig ändring sprids. @subscriber_db sysname Namnet på databasen från vilken en motstridig ändring sprids. @log_conflict UTGÅNG int Anger om sammanslagningsprocessen ska logga en konflikt för senare lösning:
0 = Att inte logga konflikten.
1 = Prenumeranten är konfliktförloraren.
2 = Publisher är konfliktförloraren.@conflict_message UTGÅNG nvarchar(512) Meddelande som ska visas om hur konflikten löstes om konflikten loggas. @destowner sysname Ägaren till den publicerade tabellen hos Subscriber. Denna lagrade procedur använder de värden som Merge Agent skickar till dessa parametrar för att implementera din anpassade konfliktlösningslogik. Den måste returnera en enda radresultatuppsättning som är identisk i struktur med bastabellen och som innehåller datavärdena för den vinnande versionen av raden.
Ge EXEKVER-behörigheter på den lagrade proceduren till alla inloggningar som används av prenumeranter för att ansluta till Publisher.
Använd en anpassad konfliktlösare med en ny tabellartikel
Utför sp_addmergearticle för att definiera en artikel.
Ange ett värde i MicrosoftSQLServer Stored Procedure Resolver för parametern @article_resolver .
Ange namnet på den lagrade procedur som implementerar konfliktlösarlogiken för @resolver_info-parametern .
För mer information, se Definiera en artikel.
Att använda en anpassad konfliktlösare med en befintlig tabellartikel
Kör sp_changemergearticle, och specificera @publication, @article, ett värde av article_resolver för @property och ett värde av MicrosoftSQLServer Stored ProcedureResolver för @value.
Kör sp_changemergearticle, och specificera @publication, @article, värdet resolver_info för @property och namnet på den lagrade proceduren som implementerar konfliktlösarlogiken för @value.
Att använda en COM-baserad anpassad resolver
Namnrymden Microsoft.SqlServer.Replication.BusinessLogicSupport implementerar ett gränssnitt som gör det möjligt att skriva komplex affärslogik för att hantera händelser och lösa konflikter som uppstår under synkroniseringsprocessen för Merge-replikering. För mer information, se Implementera en hanterare för affärslogik för en mergeartikel. Du kan också skriva din egen inbyggda kodbaserade affärslogik för att lösa konflikter. Denna logik byggs som en COM-komponent och kompileras till dynamiska länkbibliotek (DLL), med produkter som Microsoft Visual C++. Denna typ av COM-baserad anpassad konfliktlösare måste implementera ICustomResolver-gränssnittet , som är särskilt utformat för konfliktlösning.
För att skapa och registrera en COM-baserad anpassad konfliktlösare
I en COM-kompatibel författarmiljö, lägg till referenser i biblioteket för anpassad konfliktlösning.
För ett Visual C++-projekt, använd direktivet #import för att importera detta bibliotek i ditt projekt.
Skapa en klass som implementerar ICustomResolver-gränssnittet .
Implementera vissa metoder och egenskaper.
Bygg projektet för att skapa den anpassade konfliktresolver-biblioteksfilen.
Distribuera biblioteket i katalogen som innehåller Merge Agent-exekverbara filen (vanligtvis \Microsoft SQL Server\100\COM).
Anmärkning
En anpassad konfliktlösare måste distribueras hos prenumeranten för en pull-prenumeration, hos distributören för en push-prenumeration, eller på webbservern som används för webbsynkronisering.
Registrera det anpassade konfliktlösarbiblioteket genom att köra regsvr32.exe från distributionskatalogen enligt följande:
regsvr32.exe mycustomresolver.dllVid Publisher, kör sp_enumcustomresolvers (Transact-SQL) för att verifiera att biblioteket inte redan är registrerat som en anpassad konfliktlösare.
För att registrera biblioteket som en anpassad konfliktlösare, kör sp_registercustomresolver (Transact-SQL) hos distributören. Ange det vänliga namnet på COM-objektet för @article_resolver, bibliotekets ID (CLSID) för @resolver_clsid och värdet false för @is_dotnet_assembly.
Anmärkning
När det inte längre behövs kan du avregistrera en anpassad konfliktlösare genom att använda sp_unregistercustomresolver (Transact-SQL).
(Valfritt) På ett kluster, upprepa steg 6-9 för att registrera den anpassade resolvern på alla noder i klustret. Dessa steg krävs för att säkerställa att den anpassade resolvern kan ladda reconcilern korrekt efter en failover.
Att använda en anpassad konfliktlösare med en ny tabellartikel
Vid Publisher, utför sp_enumcustomresolvers (Transact-SQL) och notera det vänliga namnet på önskad resolver.
Vid Publisher i publiceringsdatabasen, kör sp_addmergearticle (Transact-SQL) för att definiera en artikel. Ange det vänliga namnet på artikelresolvern från steg 1 för @article_resolver. För mer information, se Definiera en artikel.
Att använda en anpassad konfliktlösare med en befintlig tabellartikel
Vid Publisher, utför sp_enumcustomresolvers (Transact-SQL) och notera det vänliga namnet på önskad resolver.
Utför sp_changemergearticle (Transact-SQL), där @publication, @article, värdet article_resolver för @property och vänlignamnet på artikelresolvern från steg 1 för @value specificeras.