Implementazione di un sistema di risoluzione dei conflitti personalizzato per un articolo di tipo mergeImplement a Custom Conflict Resolver for a Merge Article

In questo argomento viene descritto come implementare il sistema di risoluzione dei conflitti personalizzato per un articolo di tipo merge in SQL Server 2017SQL Server 2017 tramite Transact-SQLTransact-SQL o un sistema di risoluzione personalizzato basato su COM.This topic describes how to implement custom conflict resolver for a merge article in SQL Server 2017SQL Server 2017 by using Transact-SQLTransact-SQL or a COM-based custom resolver.

Contenuto dell'argomentoIn This Topic

Utilizzo di Transact-SQL Using Transact-SQL

È possibile scrivere un sistema di risoluzione dei conflitti personalizzato come stored procedure Transact-SQLTransact-SQL in ogni server di pubblicazione.You can write your own custom conflict resolver as a Transact-SQLTransact-SQL stored procedure at each Publisher. Durante la sincronizzazione questa stored procedure viene richiamata quando vengono rilevati conflitti in un articolo per il quale il sistema di risoluzione è stato registrato e l'agente di merge passa le informazioni sulla riga con conflitti ai parametri obbligatori della procedura.During synchronization, this stored procedure is invoked when conflicts are encountered in an article to which the resolver was registered, and information on the conflict row is passed by the Merge Agent to the required parameters of the procedure. I sistemi di risoluzione dei conflitti personalizzati basati su stored procedure vengono sempre creati nel server di pubblicazione.Stored procedure-based custom conflict resolvers are always created at the Publisher.

Nota

I sistemi di risoluzione delle stored procedure di MicrosoftMicrosoft SQL ServerSQL Server vengono richiamati solo per gestire i conflitti causati da modifiche apportate alle righe. MicrosoftMicrosoft SQL ServerSQL Server stored procedure resolvers are only invoked to handle row change-based conflicts. Non possono essere utilizzati per gestire altri tipi di conflitti, ad esempio errori di inserimento dovuti a violazioni di PRIMARY KEY o del vincolo di indice univoco.They cannot be used to handle other types of conflicts such as insert failures due to PRIMARY KEY violations or unique index constraint violations.

Per creare un sistema di risoluzione dei conflitti personalizzato basato su stored procedureTo create a stored procedure-based custom conflict resolver

  1. Nella pubblicazione o nel database msdb del server di pubblicazione creare una nuova stored procedure di sistema che implementi i parametri obbligatori seguenti:At the Publisher in either the publication or msdb database, create a new system stored procedure that implements the following required parameters:

    ParametroParameter Tipo di datiData type DescriptionDescription
    @tableowner sysnamesysname Nome del proprietario della tabella per la quale risolvere un conflitto.Name of the owner of the table for which a conflict is being resolved. Si tratta del proprietario della tabella nel database di pubblicazione.This is the owner for the table in the publication database.
    @tablename sysnamesysname Nome della tabella per la quale risolvere un conflitto.Name of the table for which a conflict is being resolved.
    @rowguid uniqueidentifieruniqueidentifier Identificatore univoco per la riga in cui è presente il conflitto.Unique identifier for the row having the conflict.
    @subscriber sysnamesysname Nome del server da cui viene propagata una modifica in conflitto.Name of the server from where a conflicting change is being propagated.
    @subscriber_db sysnamesysname Nome del database da cui viene propagata una modifica in conflitto.Name of the database from where conflicting change is being propagated.
    @log_conflict OUTPUT@log_conflict OUTPUT intint Indica se il processo di merge deve registrare un conflitto da risolvere in un secondo momento:Whether the merge process should log a conflict for later resolution:

    0 = Il conflitto non viene registrato.0 = Do not log the conflict.

    1 = La riga in conflitto è quella del Sottoscrittore.1 = Subscriber is the conflict loser.

    2 = La riga in conflitto è quella del server di pubblicazione.2 = Publisher is the conflict loser.
    @conflict_message OUTPUT@conflict_message OUTPUT nvarchar(512)nvarchar(512) Messaggio da visualizzare per la risoluzione se il conflitto viene registrato.Message to be given about the resolution if the conflict is logged.
    @destowner sysnamesysname Proprietario della tabella pubblicata nel Sottoscrittore.The owner of the published table at the Subscriber.

    Questa stored procedure utilizza i valori passati dall'agente di merge a questi parametri per implementare la logica di risoluzione dei conflitti personalizzata. Deve restituire un solo set di risultati della riga la cui struttura è identica a quella della tabella di base e che contiene i valori dei dati per la versione confermata della riga.This stored procedure uses the values passed by the Merge Agent to these parameters to implement your custom conflict resolution logic; it must return a single row result set that is identical in structure to the base table and contains the data values for the winning version of the row.

  2. Concedere autorizzazioni EXECUTE sulla stored procedure a qualsiasi account di accesso utilizzato dai Sottoscrittori per la connessione al server di pubblicazione.Grant EXECUTE permissions on the stored procedure to any logins used by Subscribers to connect to the Publisher.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un nuovo articolo di tabellaTo use a custom conflict resolver with a new table article

  1. Eseguire sp_addmergearticle per definire un articolo, specificando il valore MicrosoftSQL Server Stored Procedure Resolver per il parametro @article_resolver e il nome della stored procedure che implementa la logica del sistema di risoluzione dei conflitti per il parametro @resolver_info.Execute sp_addmergearticle to define an article, specifying a value of MicrosoftSQL Server Stored Procedure Resolver for the @article_resolver parameter and the name of the stored procedure that implements the conflict resolver logic for the @resolver_info parameter. Per altre informazioni, vedere Define an Article.For more information, see Define an Article.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un articolo di tabella esistenteTo use a custom conflict resolver with an existing table article

  1. Eseguire sp_changemergearticle, specificando @publication, @article, il valore article_resolver per @property e il valore MicrosoftSQL Server Stored ProcedureResolver per @value.Execute sp_changemergearticle, specifying @publication, @article, a value of article_resolver for @property, and a value of MicrosoftSQL Server Stored ProcedureResolver for @value.

  2. Eseguire sp_changemergearticle, specificando @publication, @article, il valore resolver_info per @propertye il nome della stored procedure che implementa la logica del sistema di risoluzione dei conflitti per @value.Execute sp_changemergearticle, specifying @publication, @article, a value of resolver_info for @property, and the name of the stored procedure that implements the conflict resolver logic for @value.

Utilizzo di un sistema di risoluzione personalizzato basato su COM Using a COM-based Custom Resolver

Lo spazio dei nomi Microsoft.SqlServer.Replication.BusinessLogicSupport implementa un'interfaccia che consente di scrivere logica di business complessa per gestire gli eventi e i risolvere conflitti che si verificano durante il processo di sincronizzazione della replica di tipo merge.The Microsoft.SqlServer.Replication.BusinessLogicSupport namespace implements an interface that enables you to write complex business logic to handle events and resolve conflicts that occur during the merge replication synchronization process. Per altre informazioni, vedere Implement a Business Logic Handler for a Merge Article.For more information, see Implement a Business Logic Handler for a Merge Article. Per risolvere i conflitti, è inoltre possibile scrivere una logica di business personalizzata basata su codice nativo.You can also write your own native code-based custom business logic to resolve conflicts. Tale logica viene compilata come un componente COM in DLL, utilizzando prodotti quali MicrosoftMicrosoft Visual C++.This logic is built as a COM component and compiled into dynamic-link libraries (DLL), using products such as MicrosoftMicrosoft Visual C++. Un simile sistema di risoluzione dei conflitti personalizzato basato su COM deve implementare l'interfaccia ICustomResolver , specificamente progettata per la risoluzione dei conflitti.Such a COM–based custom conflict resolver must implement the ICustomResolver interface, which is designed specifically for conflict resolution.

Per creare e registrare un sistema di risoluzione dei conflitti personalizzato basato su COMTo create and register a COM-based custom conflict resolver

  1. In un ambiente di creazione compatibile con COM aggiungere riferimenti alla libreria del sistema di risoluzione dei conflitti personalizzato.In a COM-compatible authoring environment, add references to the Custom Conflict Resolver library.

  2. Per un progetto Visual C++ utilizzare la direttiva #import per importare la libreria nel progetto.For a Visual C++ project, use the #import directive to import this library into your project.

  3. Creare una classe che implementa l'interfaccia ICustomResolver .Create a class that implements the ICustomResolver interface.

  4. Implementare determinati metodi e proprietà.Implement certain methods and properties.

  5. Compilare il progetto per creare il file della libreria del sistema di risoluzione dei conflitti personalizzato.Build the project to create the custom conflict resolver library file.

  6. Distribuire la libreria nella directory che contiene il file eseguibile dell'agente di merge, in genere \Microsoft SQL Server\100\COM.Deploy the library in the directory containing the merge agent executable (usually \Microsoft SQL Server\100\COM).

    Nota

    Un sistema di risoluzione dei conflitti personalizzato deve essere distribuito nel Sottoscrittore per una sottoscrizione pull, nel server di distribuzione per una sottoscrizione push o nel server Web utilizzato con sincronizzazione tramite il Web.A custom conflict resolver must be deployed at the Subscriber for a pull subscription, at the Distributor for a push subscription, or at the Web server used with Web synchronization.

  7. Registrare la libreria del sistema di risoluzione dei conflitti personalizzato utilizzando regsvr32.exe nella directory di distribuzione come descritto di seguito:Register the custom conflict resolver library using regsvr32.exe from the deployment directory as follows:

    regsvr32.exe mycustomresolver.dll  
    
  8. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) per verificare che la libreria non sia già registrata come sistema di risoluzione dei conflitti personalizzato.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) to verify that the library is not already registered as a custom conflict resolver.

  9. Per registrare la libreria come sistema di risoluzione dei conflitti personalizzato, eseguire sp_registercustomresolver (Transact-SQL) nel database di distribuzione.To register the library as a custom conflict resolver, execute sp_registercustomresolver (Transact-SQL), at the Distributor. Specificare il nome descrittivo dell'oggetto COM per @article_resolver, l'ID (CLSID) della libreria per @resolver_clside il valore false per @is_dotnet_assembly.Specify the friendly name of the COM object for @article_resolver, the library's ID (CLSID) for @resolver_clsid, and a value of false for @is_dotnet_assembly.

    Nota

    Quando un sistema di risoluzione dei conflitti personalizzato non è più necessario, è possibile annullarne la registrazione con sp_unregistercustomresolver (Transact-SQL).When no longer needed, a custom conflict resolver can be unregistered using sp_unregistercustomresolver (Transact-SQL).

  10. (Facoltativo) In un cluster ripetere i passaggi da 5 a 8 per registrare il sistema di risoluzione personalizzato in tutti i nodi del cluster.(Optional) On a cluster, repeat steps 5-8 to register the custom resolver on all nodes of the cluster. Tale operazione è necessaria per garantire che il sistema di risoluzione personalizzato sia in grado di caricare correttamente il riconciliatore in seguito a un failover.This is required to ensure that the custom resolver will be able to properly load the reconciler following a failover.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un nuovo articolo di tabellaTo use a custom conflict resolver with a new table article

  1. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) e prendere nota del nome descrittivo del sistema di risoluzione desiderato.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) and note the friendly name of the desired resolver.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL) per definire un articolo.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define an article. Specificare il nome descrittivo del sistema di risoluzione dei conflitti dell'articolo ottenuto al passaggio 1 per @article_resolver.Specify the friendly name of the article resolver from step 1 for @article_resolver. Per altre informazioni, vedere Define an Article.For more information, see Define an Article.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un articolo di tabella esistenteTo use a custom conflict resolver with an existing table article

  1. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) e prendere nota del nome descrittivo del sistema di risoluzione desiderato.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) and note the friendly name of the desired resolver.

  2. Eseguire sp_addmergearticle (Transact-SQL), specificando @publication, @article, il valore article_resolver per @property e il nome descrittivo del sistema di risoluzione dei conflitti dell'articolo dal passaggio 1 per @value.Execute sp_changemergearticle (Transact-SQL), specifying @publication, @article, a value of article_resolver for @property, and the friendly name of the article resolver from step 1 for @value.

Vedere ancheSee Also

Advanced Merge Replication Conflict Detection and Resolution Advanced Merge Replication Conflict Detection and Resolution
COM-Based Custom Resolvers COM-Based Custom Resolvers
Procedure consigliate per la sicurezza della replicaReplication Security Best Practices