Procedura: Impostazione di un sistema di risoluzione dei conflitti dell'articolo di merge (programmazione Transact-SQL della replica)

Quando si definisce un articolo per una pubblicazione di tipo merge, è possibile specificare un sistema di risoluzione dei conflitti personalizzato. Per ulteriori informazioni, vedere Rilevamento e risoluzione avanzati dei conflitti nella replica di tipo merge. Microsoft SQL Server include diversi sistemi di risoluzione dei conflitti predefiniti. È tuttavia possibile scriverne uno personalizzato. Se è necessario implementare logica personalizzata che viene eseguita per ogni riga replicata e non solo per quelle in conflitto, vedere Procedura: Implementazione di un gestore della logica di business per un articolo di merge (programmazione della replica).

Per registrare un sistema di risoluzione dei conflitti personalizzato

  1. Se si intende registrare un sistema di risoluzione dei conflitti personalizzato, creare uno dei tipi seguenti:

  2. Per determinare se il sistema di risoluzione desiderato è già registrato, eseguire sp_enumcustomresolvers (Transact-SQL) in qualsiasi database del server di pubblicazione. Verrà visualizzata una descrizione del sistema di risoluzione personalizzato, nonché l'identificatore di classe (CLSID) di ogni sistema di risoluzione basato su COM registrato nel server di distribuzione oppure informazioni sull'assembly gestito per ogni gestore della logica di business registrato nel server di distribuzione.

  3. Se il sistema di risoluzione personalizzato desiderato non è già registrato, eseguire sp_registercustomresolver (Transact-SQL) nel server di distribuzione. Specificare un nome per il sistema di risoluzione per @article_resolver. Nel caso di un gestore della logica di business, si tratta del nome descrittivo dell'assembly. Per i sistemi di risoluzione basati su COM, specificare il CLSID della DLL per @resolver_clsid, mentre per un gestore della logica di business specificare il valore true per @is_dotnet_assembly, il nome dell'assembly per @dotnet_assembly_name e il nome completo della classe che sostituisce BusinessLogicModule per @dotnet_class_name.

    Nota

    Se un assembly del gestore della logica di business non viene distribuito nella stessa directory del file eseguibile dell'agente di merge, è necessario specificare il percorso completo indicando il nome dell'assembly per @dotnet_assembly_name nella stessa directory dell'applicazione che avvia in modo sincrono l'agente di merge o nella Global Assembly Cache (GAC).

  4. Se il sistema di risoluzione è basato su COM:

    • Copiare la DLL del sistema di risoluzione personalizzato nel server di distribuzione per le sottoscrizioni push o nel Sottoscrittore per le sottoscrizioni pull.

      Nota

      I sistemi di risoluzione personalizzati Microsoft sono disponibili nella directory C:\Programmi\Microsoft SQL Server\100\COM.

    • Utilizzare regsvr32.exe per registrare la DLL del sistema di risoluzione personalizzato con il sistema operativo. Ad esempio, eseguire il seguente comando dal prompt dei comandi per registrare il sistema di risoluzione dei conflitti aggiuntivi SQL Server:

      regsvr32 ssradd.dll
      
  5. Se il sistema di risoluzione è un gestore della logica di business, distribuire l'assembly nella stessa cartella del file eseguibile dell'agente di merge (replmerg.exe), nella stessa cartella di un'applicazione che richiama l'agente di merge o nella cartella specificata per il parametro @dotnet_assembly_name al passaggio 3.

    Nota

    Il percorso di installazione predefinito del file eseguibile dell'agente di merge è C:\Programmi\Microsoft SQL Server\100\COM.

Per specificare un sistema di risoluzione personalizzato durante la definizione di un articolo di merge

  1. Se si intende utilizzare un sistema di risoluzione dei conflitti personalizzato, crearlo e registrarlo utilizzando la procedura sopra riportata.

  2. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) e notare il nome del sistema di risoluzione personalizzato desiderato nel campo value del set di risultati.

  3. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare il nome del sistema di risoluzione ottenuto al passaggio 2 per @article_resolver ed eventuale input obbligatorio per il sistema di risoluzione personalizzato utilizzando il parametro @resolver_info. Per sistemi di risoluzione personalizzati basati su stored procedure, @resolver_info corrisponde al nome della stored procedure. Per ulteriori informazioni sull'input obbligatorio per i sistemi di risoluzione dei conflitti forniti da Microsoft, vedere Sistemi di risoluzione dei conflitti basati su Microsoft COM.

Per specificare o modificare un sistema di risoluzione personalizzato per un articolo di merge esistente

  1. Per determinare se per un articolo è stato definito un sistema di risoluzione personalizzato oppure per ottenere il nome del sistema di risoluzione, eseguire sp_helpmergearticle (Transact-SQL). Se per l'articolo è stato definito un sistema di risoluzione personalizzato, il relativo nome verrà visualizzato nel campo article_resolver. Eventuale input fornito al sistema di risoluzione verrà visualizzato nel campo resolver_info del set di risultati.

  2. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) e notare il nome del sistema di risoluzione personalizzato desiderato nel campo value del set di risultati.

  3. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle (Transact-SQL). Specificare il valore article_resolver, incluso il percorso completo dei gestori della logica di business, per @property, nonché il nome del sistema di risoluzione personalizzato desiderato ottenuto al passaggio 2 per @value.

  4. Per modificare eventuale input obbligatorio per il sistema di risoluzione personalizzato, eseguire nuovamente sp_changemergearticle (Transact-SQL). Specificare il valore resolver_info per @property ed eventuale input obbligatorio per il sistema di risoluzione personalizzato per @value. Per sistemi di risoluzione personalizzati basati su stored procedure, @resolver_info corrisponde al nome della stored procedure. Per ulteriori informazioni sull'input obbligatorio, vedere Sistemi di risoluzione dei conflitti basati su Microsoft COM.

Per annullare la registrazione di un sistema di risoluzione dei conflitti personalizzato

  1. Nel server di pubblicazione eseguire sp_enumcustomresolvers (Transact-SQL) e notare il nome del sistema di risoluzione personalizzato da rimuovere nel campo value del set di risultati.

  2. Eseguire sp_unregistercustomresolver (Transact-SQL) nel server di distribuzione. Specificare il nome completo del sistema di risoluzione personalizzato ottenuto al passaggio 1 per @article_resolver.

Esempio

In questo esempio viene creato un nuovo articolo e viene impostato l'utilizzo del sistema di risoluzione dei conflitti medi SQL Server per calcolare la media della colonna UnitPrice in caso di conflitti.

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @article_resolver = 'Microsoft SQL Server Averaging Conflict Resolver', 
    @resolver_info = 'UnitPrice';
GO

In questo esempio un articolo viene impostato in modo da utilizzare il sistema di risoluzione dei conflitti aggiuntivi SQL Server per calcolare la somma della colonna UnitsOnOrder in caso di conflitti.

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='article_resolver', 
    @value='Microsoft SQL Server Additive Conflict Resolver';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='resolver_info', 
    @value='UnitsOnOrder';
GO