Implementazione di un sistema di risoluzione dei conflitti personalizzato per un articolo di tipo merge

Si applica a:SQL Server

Questo argomento illustra come implementare il sistema di risoluzione dei conflitti personalizzato per un articolo di tipo merge in SQL Server tramite Transact-SQL o un sistema di risoluzione personalizzato basato su COM.

Utilizzo di Transact-SQL

È possibile scrivere un programma di risoluzione dei conflitti personalizzato sotto forma di stored procedure Transact-SQL in ogni server di pubblicazione. Durante la sincronizzazione, questa procedura archiviata viene invocata quando si verificano conflitti in un articolo per il quale è stato registrato il sistema di risoluzione. Le informazioni sulla riga con conflitti vengono passate dall'agente di merge ai parametri obbligatori della procedura. I resolver dei conflitti personalizzati basati su procedure memorizzate vengono sempre creati nel Publisher.

Nota

I sistemi di risoluzione delle stored procedure di Microsoft SQL Server vengono chiamati solo per gestire i conflitti causati da modifiche apportate alle righe. Non possono essere usati per gestire altri tipi di conflitti, ad esempio errori di inserimento dovuti a violazioni di PRIMARY KEY o del vincolo di indice univoco.

Per creare un sistema di risoluzione dei conflitti personalizzato basato su stored procedure

  1. Nel server di pubblicazione, nel database di pubblicazione o nel database msdb, creare una nuova stored procedure di sistema che implementi i seguenti parametri obbligatori:

    Parametro Tipo di dati Descrizione
    @tableowner sysname Nome del proprietario della tabella per la quale si sta risolvendo un conflitto. Si tratta del proprietario della tabella nel database di pubblicazione.
    @tablename sysname Nome della tabella per la quale è in corso la risoluzione di un conflitto.
    @rowguid uniqueidentifier Identificatore univoco per la riga in cui è presente il conflitto.
    @subscriber sysname Nome del server da cui viene propagata una modifica in conflitto.
    @subscriber_db sysname Nome del database da cui viene propagata una modifica in conflitto.
    @log_conflict OUTPUT int Indica se il processo di merge deve registrare un conflitto da risolvere in un secondo momento:

    0 = Il conflitto non viene registrato.

    1 = Il sottoscrittore perde il conflitto.

    2 = Il Publisher perde il conflitto.
    @conflict_message OUTPUT nvarchar(512) Messaggio da fornire sulla risoluzione se il conflitto viene registrato.
    @destowner sysname Il proprietario della tabella pubblicata presso il Sottoscrittore.

    Questa procedura archiviata usa i valori passati dal agente di merge tramite questi parametri per implementare la logica personalizzata di risoluzione dei conflitti. Deve restituire un set di risultati costituito da una singola riga, identico nella struttura alla tabella di base e contenente i valori dei dati della versione vincente della riga.

  2. Concedere le autorizzazioni EXECUTE sulla stored procedure a qualsiasi login utilizzato dai Sottoscrittori per connettersi al server di pubblicazione.

Usare un sistema di risoluzione dei conflitti personalizzato con un nuovo articolo di tabella

  1. Eseguire sp_addmergearticle per definire un articolo.

  2. Specificare il valore MicrosoftSQLServer Stored Procedure Resolver per il parametro article_resolver.

  3. Specificare il nome della stored procedure che implementa la logica del sistema di risoluzione dei conflitti per il parametro @resolver_info.

    Per altre informazioni, vedere Definire un articolo.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un articolo di tabella esistente

  1. Eseguire sp_changemergearticle, specificando @publication, @article, il valore article_resolver per @property e il valore MicrosoftSQLServer Stored ProcedureResolver per @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.

Uso di un sistema di risoluzione personalizzato basato su COM

Lo spazio dei nomi Microsoft.SqlServer.Replication.BusinessLogicSupport implementa un'interfaccia che consente di scrivere logica di business complessa per gestire gli eventi e risolvere i conflitti che si verificano durante il processo di sincronizzazione della replica di merge. Per altre informazioni, vedere Implementare un handler della logica di business per un articolo Merge. Per risolvere i conflitti, è inoltre possibile scrivere una logica di business personalizzata basata su codice nativo. Tale logica viene compilata come un componente COM in DLL, usando prodotti quali Microsoft Visual C++. Questo tipo di sistema di risoluzione dei conflitti personalizzato basato su COM deve implementare l'interfaccia ICustomResolver, specificamente progettata per la risoluzione dei conflitti.

Per creare e registrare un sistema di risoluzione dei conflitti personalizzato basato su COM

  1. In un ambiente di creazione compatibile con COM aggiungere riferimenti alla libreria del sistema di risoluzione dei conflitti personalizzato.

  2. Per un progetto Visual C++ utilizzare la direttiva #import per importare la libreria nel progetto.

  3. Creare una classe che implementa l'interfaccia ICustomResolver .

  4. Implementare determinati metodi e proprietà.

  5. Compilare il progetto per creare il file della libreria del sistema di risoluzione dei conflitti personalizzato.

  6. Distribuire la libreria nella directory che contiene il file eseguibile dell'agente di merge, in genere \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.

  7. Registrare la libreria del sistema di risoluzione dei conflitti personalizzato eseguendo regsvr32.exe nella directory di distribuzione come descritto di seguito:

    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.

  9. Per registrare la libreria come sistema di risoluzione dei conflitti personalizzato, eseguire sp_registercustomresolver (Transact-SQL) nel database di distribuzione. 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.

    Nota

    Quando un sistema di risoluzione dei conflitti personalizzato non è più necessario, è possibile annullarne la registrazione con sp_unregistercustomresolver (Transact-SQL).

  10. (Facoltativo) In un cluster ripetere i passaggi da 6 a 9 per registrare il sistema di risoluzione personalizzato in tutti i nodi del cluster. Tali passaggi sono necessari per garantire che il sistema di risoluzione personalizzato possa caricare correttamente il riconciliatore in seguito a un failover.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un nuovo articolo di tabella

  1. Nel server di pubblicazione, eseguire sp_enumcustomresolvers (Transact-SQL) e annotare il nome descrittivo del resolver desiderato.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL) per definire un articolo. Specificare il nome descrittivo del risolutore di articoli del passaggio 1 per @article_resolver. Per altre informazioni, vedere Definire un articolo.

Per utilizzare un sistema di risoluzione dei conflitti personalizzato con un articolo di tabella esistente

  1. Nel server di pubblicazione, eseguire sp_enumcustomresolvers (Transact-SQL) e annotare il nome descrittivo del resolver desiderato.

  2. Eseguire sp_changemergearticle (Transact-SQL), specificando @publication, @article, un valore di article_resolver per @property e il nome descrittivo del resolver dell'articolo indicato nel passaggio 1 per @value.