Condividi tramite


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

In questo argomento viene descritto come implementare il sistema di risoluzione dei conflitti personalizzato per un articolo di tipo merge in SQL Server 2012 tramite Transact-SQL o un sistema di risoluzione personalizzato basato su COM.

Contenuto dell'argomento

  • Per implementare un sistema di risoluzione dei conflitti personalizzato per un articolo di tipo merge, utilizzando:

    Transact-SQL

    Sistema di risoluzione basato su COM

Utilizzo di Transact-SQL

È possibile scrivere un sistema di risoluzione dei conflitti personalizzato come stored procedure Transact-SQL in ogni server di pubblicazione. 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. I sistemi di risoluzione dei conflitti personalizzati basati su stored procedure vengono sempre creati nel server di pubblicazione.

[!NOTA]

I sistemi di risoluzione delle stored procedure Microsoft SQL Server vengono richiamati solo per gestire conflitti causati da modifiche apportate alle righe. 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.

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

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

    Parametro

    Tipo di dati

    Descrizione

    @tableowner

    sysname

    Nome del proprietario della tabella per la quale risolvere un conflitto. Si tratta del proprietario della tabella nel database di pubblicazione.

    @tablename

    sysname

    Nome della tabella per la quale risolvere 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 = La riga in conflitto è quella del Sottoscrittore.

    2 = La riga in conflitto è quella del server di pubblicazione.

    @conflict_message OUTPUT

    nvarchar(512)

    Messaggio da visualizzare per la risoluzione se il conflitto viene registrato.

    @destowner

    sysname

    Proprietario della tabella pubblicata nel Sottoscrittore.

    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.

  2. Concedere autorizzazioni EXECUTE sulla stored procedure a qualsiasi account di accesso utilizzato dai Sottoscrittori per la connessione al server di pubblicazione.

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

  • Eseguire sp_addmergearticle per definire un articolo, specificando il valore del Sistema di risoluzione delle stored procedure di Microsoft SQL Server 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. Per ulteriori informazioni, vedere Definizione di 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 del Sistema di risoluzione delle stored procedure di Microsoft SQL Server per @value.

  2. Eseguire sp_changemergearticle, specificando @publication, @article, il valore resolver_info per @property e il nome della stored procedure che implementa la logica del sistema di risoluzione dei conflitti per @value.

Icona freccia utilizzata con il collegamento Torna all'inizio[Inizio pagina]

Utilizzo 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 i risolvere conflitti che si verificano durante il processo di sincronizzazione della replica di tipo merge. Per ulteriori informazioni, vedere Implementazione di un gestore della logica di business per un articolo di 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, utilizzando prodotti quali Microsoft 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.

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 utilizzando 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 è 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 server di distribuzione. Specificare il nome descrittivo dell'oggetto COM per @article_resolver, l'ID (CLSID) della libreria per @resolver_clsid e il valore false per @is_dotnet_assembly.

    [!NOTA]

    Quando un sistema di risoluzione dei conflitti personalizzato non è più necessario, è possibile annullarne la registrazione utilizzando 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. Tale operazione è necessaria per garantire che il sistema di risoluzione personalizzato sia in grado di 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 notare il nome descrittivo del sistema di risoluzione desiderato.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL) per definire un articolo. Specificare il nome descrittivo del sistema di risoluzione dei conflitti dell'articolo ottenuto al passaggio 1 per @article_resolver. Per ulteriori informazioni, vedere Definizione di 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 notare il nome descrittivo del sistema di risoluzione desiderato.

  2. Eseguire sp_changemergearticle (Transact-SQL), specificando @publication, @article, il valore article_resolver per @property e il nome descrittivo del sistema di risoluzione dei conflitti dell'articolo ottenuto al passaggio 1 per @value.

Icona freccia utilizzata con il collegamento Torna all'inizio[Inizio pagina]

Visualizzazione di un sistema di risoluzione personalizzato di esempio

  1. Un esempio è disponibile nei file di esempio di SQL Server 2000. Scaricare il file sql2000samples.cab dalla pagina relativa agli esempi aggiornati per SQL Server 2000 Service Pack 3. Vengono scaricati 8 file per un totale di 6,9 MB.

  2. Estrarre i file dal file con estensione cab compresso scaricato.

  3. Eseguire setup.exe

    [!NOTA]

    Quando si scelgono le opzioni di installazione, è necessario installare solo gli esempi relativi alla replica. Il percorso di installazione predefinito è C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\.

  4. Passare alla cartella di installazione. La cartella predefinita è C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe.

  5. Eseguire il programma unzip_sqlreplSP3.exe.

    [!NOTA]

    Tramite il sistema di risoluzione COM di esempio l'installazione verrà eseguita, per impostazione predefinita, nella cartella C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres.

  6. Nella cartella subspres sono disponibili tutte le occorrenze di #include sqlres.h in tutti i file di origine e verranno sostituiti con #import "replrec.dll" no_namespace, raw_interfaces_only.

Vedere anche

Concetti

Rilevamento e risoluzione avanzati dei conflitti nella replica di tipo merge

Sistemi di risoluzione personalizzati basati su COM

Procedure consigliate per la sicurezza della replica