Specificare le proprietà per la replica di tipo merge

Si applica a: SQL Server

Questo argomento illustra come specificare varie proprietà per la replica di tipo merge.

Articolo di merge di solo download

Gli articoli di solo download sono progettati per le applicazioni i cui dati non vengono aggiornati nei Sottoscrittori. Per altre informazioni, vedere Ottimizzare le prestazioni della replica di tipo merge con gli articoli di solo download.

Considerazioni

  • Se si specifica che un articolo è di tipo solo download dopo l'inizializzazione delle sottoscrizioni, tutte le sottoscrizioni client a cui è stato inviato l'articolo devono essere reinizializzate. Non è necessario reinizializzare le sottoscrizioni server. Per altre informazioni sugli effetti delle modifiche delle proprietà, vedere Modifica delle proprietà di pubblicazioni e articoli.

Usare SQL Server Management Studio

Nella pagina Articoli

Selezionare una tabella nella pagina Articoli di Creazione guidata nuova pubblicazione e quindi selezionare la casella di controllo La tabella evidenziata è di tipo solo download.

Nella scheda Proprietà della finestra delle proprietà dell'articolo

  1. Nella pagina Articoli della Creazione guidata nuova pubblicazione o nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione> selezionare una tabella e quindi fare clic su Proprietà articolo.

  2. Fare clic su Imposta proprietà dell'articolo di tabelle evidenziato o su Imposta proprietà di tutti gli articoli di tabelle.

  3. Nella sezione Oggetto di destinazione della scheda Proprietà della finestra di dialogo Proprietà articolo - <Articolo> specificare uno dei valori seguenti in Direzione sincronizzazione:

    • Solo download sul Sottoscrittore, non consentire modifiche del Sottoscrittore
    • Solo download sul Sottoscrittore, consenti modifiche del Sottoscrittore
  4. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.

Usare Transact-SQL

Nuovo articolo

  1. Eseguire sp_addmergearticle, specificando il valore 1 o 2 per il parametro @subscriber_upload_options. I numeri corrispondono al comportamento seguente:

    • 0 : nessuna restrizione (valore predefinito). Le modifiche eseguite nel Sottoscrittore vengono caricate nel server di pubblicazione.
    • 1 : le modifiche sono consentite nel Sottoscrittore, ma non vengono caricate nel server di pubblicazione.
    • 2 : non è consentito apportare modifiche nel Sottoscrittore.

    Nota

    Se la tabella di origine di un articolo è già inclusa in un'altra pubblicazione, il valore di @subscriber_upload_options deve coincidere per entrambi gli articoli.

Articolo esistente

  1. Per determinare se un articolo è di solo download, eseguire sp_helpmergearticle e verificare il valore di upload_options per l'articolo nel set di risultati.

  2. Se il valore restituito al passaggio 1 è 0, eseguire sp_changemergearticle, specificando il valore subscriber_upload_options per @property, il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription e il valore 1 o 2 per @value, che corrisponde al comportamento seguente:

    • 1 : le modifiche sono consentite nel Sottoscrittore, ma non vengono caricate nel server di pubblicazione.

    • 2 : non è consentito apportare modifiche nel Sottoscrittore.

      Nota

      Se la tabella di origine di un articolo è già inclusa in un'altra pubblicazione, il comportamento del solo download deve coincidere per entrambi gli articoli.

Interactive Conflict Resolution

La replica di Microsoft SQL Server offre un sistema di risoluzione interattivo che consente di risolvere i conflitti manualmente durante la sincronizzazione su richiesta in Gestione sincronizzazione di Microsoft Windows. Dopo l'abilitazione della risoluzione interattiva, risolvere interattivamente i conflitti durante la sincronizzazione utilizzando il sistema di risoluzione interattivo. Il sistema di risoluzione interattivo è disponibile tramite Gestione sincronizzazione di Microsoft Windows. Per altre informazioni, vedere Sincronizzare una sottoscrizione mediante Gestione sincronizzazione Microsoft Windows (Gestione sincronizzazione Microsoft Windows).

Consigli

  • Se si esegue una sincronizzazione all'esterno di Gestione sincronizzazione Microsoft Windows, ad esempio una sincronizzazione pianificata o su richiesta in SQL Server Management Studio o Monitoraggio replica, i conflitti vengono risolti automaticamente senza l'intervento dell'utente, utilizzando la risoluzione dei conflitti predefinita specificata per l'articolo. Per altre informazioni, vedere Interactive Conflict Resolution.

Usare SQL Server Management Studio

Abilitare la risoluzione interattiva dei conflitti per un articolo

  1. Selezionare una tabella nella pagina Articoli della Creazione guidata nuova pubblicazione o nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione>. Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.
  2. Fare clic su Proprietà articolo, quindi su Imposta proprietà dell'articolo di tabella evidenziato o su Imposta proprietà di tutti gli articoli di tabelle.
  3. Nella pagina Proprietà articolo - <Articolo> o Proprietà di tutti gli articoli - <Tipo articolo> fare clic sulla scheda Sistema di risoluzione.
  4. Selezionare Consenti la risoluzione interattiva dei conflitti nel Sottoscrittore durante la sincronizzazione su richiesta.
  5. Seleziona OK.
  6. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.

Specificare la risoluzione interattiva dei conflitti per una sottoscrizione

  1. Nella finestra di dialogo Proprietà sottoscrizione - <Sottoscrittore>: <DatabaseSottoscrizione> specificare un valore True per l'opzione Risoluzione interattiva dei conflitti. Per ulteriori informazioni sull'accesso a questa finestra di dialogo, vedere View and Modify Push Subscription Properties e View and Modify Pull Subscription Properties.
  2. Seleziona OK.

Usare Transact-SQL

È possibile impostare a livello di programmazione un Sottoscrittore in modo che utilizzi questa interfaccia grafica per risolvere conflitti relativi agli articoli quando viene creata una sottoscrizione pull di una pubblicazione di tipo merge. Nel sistema di risoluzione interattivo verranno visualizzati solo i conflitti relativi ad articoli che supportano questa opzione.

Creare una sottoscrizione pull di tipo merge che usa il sistema di risoluzione interattivo

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_helpmergearticle, specificando @publication. Notare il valore di allow_interactive_resolver relativo a ogni articolo nel set di risultati per il quale verrà utilizzato il sistema di risoluzione interattivo.
    • Se questo valore è 1, il sistema di risoluzione interattivo verrà utilizzato.
    • Se questo valore è 0, è prima necessario attivare il sistema di risoluzione interattivo per ogni articolo. A tale scopo, eseguire sp_changemergearticle, specificando @publication, @article, il valore allow_interactive_resolver per @property e il valore true per @value.
  2. Nel database di sottoscrizione del Sottoscrittore eseguire sp_addmergepullsubscription. Per altre informazioni, vedere Creazione di una sottoscrizione pull.
  3. Nel database di sottoscrizione del Sottoscrittore eseguire sp_addmergepullsubscription_agent specificando i parametri seguenti:
    • @publisher, @publisher_db (database pubblicato) e @publication.
    • Il valore true per @enabled_for_syncmgr.
    • Il valore true per @use_interactive_resolver.
    • Le informazioni sull'account di sicurezza richieste dall'agente di merge. Per altre informazioni, vedere Creazione di una sottoscrizione pull.
  4. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergesubscription.

Definire un articolo che supporta il sistema di risoluzione interattivo

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle. Specificare il nome della pubblicazione cui appartiene l'articolo per @publication, il nome dell'articolo per @article, l'oggetto di database da pubblicare per @source_object e il valore true per @allow_interactive_resolver. Per altre informazioni, vedere definire un articolo.

Livello di rilevamento e risoluzione dei conflitti per gli articoli di merge

Questo argomento descrive come specificare il livello di rilevamento e risoluzione dei conflitti per gli articoli di merge in SQL Server tramite SQL Server Management Studio o Transact-SQL.

Quando si sincronizza una sottoscrizione di una pubblicazione di tipo merge, la replica verifica la presenza di conflitti causati dalle modifiche apportate agli stessi dati nel server di pubblicazione e nel Sottoscrittore. È possibile specificare se rilevare i conflitti a livello di riga, ovvero considerare un conflitto qualsiasi modifica apportata alla riga, o a livello di colonna, ovvero considerare un conflitto solo le modifiche apportate alla stessa riga e colonna. La risoluzione dei conflitti relativi agli articoli viene eseguita a livello di riga. Per ulteriori informazioni sul rilevamento e sulla risoluzione dei conflitti in caso di utilizzo dei record logici, vedere Detecting and Resolving Conflicts in Logical Records.

Limitazioni e restrizioni

  • Se si modifica il livello di rilevamento in seguito all'inizializzazione delle sottoscrizioni, sarà necessario reinizializzarle. Per altre informazioni sugli effetti delle modifiche delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.
  • Con il rilevamento a livello di riga e di colonna, la risoluzione dei conflitti viene sempre eseguita a livello di riga, ovvero la riga che prevale sovrascrive quella perdente. La replica di tipo merge consente inoltre di specificare che i conflitti vengano rilevati e risolti a livello di record logico. Queste opzioni tuttavia non sono disponibili in SQL Server Management Studio. Per informazioni sulla relativa impostazione dalle stored procedure di replica, vedere Definizione di una relazione tra record logici degli articoli di tabelle di merge.

Usare SQL Server Management Studio

Specificare il rilevamento a livello di riga o colonna per gli articoli di merge nella scheda Proprietà della finestra di dialogo Proprietà articolo, disponibile nella Creazione guidata nuova pubblicazione e nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione>. Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.

Specificare il rilevamento a livello di riga o di colonna

  1. Selezionare una tabella nella pagina Articoli della Creazione guidata nuova pubblicazione o nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione>.
  2. Fare clic su Proprietà articolo, quindi su Imposta proprietà dell'articolo di tabella evidenziato o su Imposta proprietà di tutti gli articoli di tabelle.
  3. Nella scheda Proprietà della finestra di dialogo Proprietà articolo <Articolo> selezionare uno dei valori seguenti per la proprietà Livello rilevamento: Rilevamento a livello di riga o Rilevamento a livello di colonna.
  4. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.

Usare Transact-SQL

Per specificare le opzioni di rilevamento dei conflitti per un nuovo articolo di merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle e specificare uno dei valori seguenti per @column_tracking:

    • true : consente di utilizzare il rilevamento a livello di colonna per l'articolo.
    • false : consente di utilizzare il rilevamento a livello di riga, che corrisponde all'impostazione predefinita.

Modificare le opzioni di rilevamento dei conflitti per un articolo di merge

  1. Per determinare le opzioni di rilevamento dei conflitti per un articolo di merge, eseguire sp_helpmergearticle. Notare il valore dell'opzione column_tracking nel set di risultati relativo l'articolo. Il valore 1 indica che viene utilizzato il rilevamento a livello di colonna, mentre il valore 0 indica che viene utilizzato il rilevamento a livello di riga.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle. Specificare il valore column_tracking per @property e uno dei valori seguenti per @value:

    • true : consente di utilizzare il rilevamento a livello di colonna per l'articolo.
    • false : consente di utilizzare il rilevamento a livello di riga, che corrisponde all'impostazione predefinita.

    Specificare il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.

Gestire il rilevamento delle eliminazioni

Nota

Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Per impostazione predefinita, la replica di tipo merge consente di sincronizzare i comandi DELETE tra server di pubblicazione e Sottoscrittore. Con la replica di tipo merge le righe vengono mantenute nel database di sottoscrizione anche se sono state eliminate dalla pubblicazione e viceversa. È possibile specificare a livello di programmazione che i comandi DELETE vengano ignorati durante la creazione di un nuovo articolo oppure attivare questa funzionalità in un secondo momento utilizzando le stored procedure di replica.

Importante

L'attivazione di questa funzionalità causa la non convergenza pertanto i dati presenti nel Sottoscrittore non rifletteranno accuratamente i dati presenti nel server di pubblicazione. È necessario implementare un meccanismo personalizzato per la rimozione manuale delle righe eliminate.

Specificare di ignorare le eliminazioni per un nuovo articolo di merge

Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare il valore false per @delete_tracking. Per altre informazioni, vedere definire un articolo.

Nota

Se la tabella di origine di un articolo è già pubblicata in un'altra pubblicazione, il valore di delete_tracking deve essere uguale per entrambi gli articoli.

Specificare di ignorare le eliminazioni per un articolo di merge esistente

  1. Per determinare se la compensazione errori è abilitata per un articolo, eseguire sp_helpmergearticle (Transact-SQL) e prendere nota del valore di delete_tracking nel set di risultati. Se questo valore è 0, le eliminazioni vengono già ignorate.

  2. Se il valore ottenuto al passaggio 1 è 1, eseguire sp_changemergearticle (Transact-SQL) nel database di pubblicazione del server di pubblicazione. Specificare il valore delete_tracking per @property e il valore false per @value.

    Nota

    Se la tabella di origine di un articolo è già pubblicata in un'altra pubblicazione, il valore di delete_tracking deve essere uguale per entrambi gli articoli.

Ordine di elaborazione

La replica di tipo merge consente di specificare l'ordine in cui gli articoli vengono elaborati dall'agente di merge durante il processo di sincronizzazione. È possibile assegnare a livello di programmazione un ordine a ogni articolo creato utilizzando le stored procedure di replica. Gli articoli vengono elaborati in ordine crescente in base al valore. Se due articoli hanno lo stesso valore, essi vengono elaborati simultaneamente.

Modalità di determinazione dell'ordine di elaborazione

Durante la sincronizzazione di tipo merge, gli articoli vengono elaborati per impostazione predefinita nell'ordine richiesto dalle dipendenze tra gli oggetti, inclusi i vincoli di integrità referenziale dichiarativa definiti nelle tabelle di base. L'elaborazione prevede l'enumerazione delle modifiche apportate a una tabella e quindi l'applicazione di tali modifiche. Se non è presente l'integrità referenziale dichiarativa ma esistono filtri join o record logici tra gli articoli di tabella, gli articoli vengono elaborati nell'ordine richiesto dai filtri e dai record logici. Gli articoli non correlati ad altri articoli tramite integrità referenziale dichiarativa, filtri join, record logici o altre dipendenze vengono elaborati in base al nome alternativo dell'articolo nella tabella di sistema sysmergearticles (Transact-SQL).

Si consideri una pubblicazione in cui sono incluse le tabelle SalesOrderHeader e SalesOrderDetail con una colonna chiave primaria SalesOrderID nella tabella SalesOrderHeader e una colonna chiave esterna SalesOrderID corrispondente nella tabella SalesOrderDetail . Durante la sincronizzazione, la replica di tipo merge impedisce le violazioni della chiave esterna inserendo nuove righe in SalesOrderHeader prima dell'inserimento delle righe associate in SalesOrderDetail. Analogamente, le righe vengono eliminate da SalesOrderDetail prima dell'eliminazione delle righe associate da SalesOrderHeader.

In alcune applicazioni, tuttavia, l'integrità referenziale viene applicata tramite trigger di database o a livello di applicazione, anziché tramite integrità referenziale dichiarativa. Nel caso della pubblicazione sopra descritta, anziché utilizzare l'integrità referenziale dichiarativa, la tabella SalesOrderDetail potrebbe disporre di un trigger di inserimento in grado di verificare l'esistenza della riga associata nella tabella SalesOrderHeader prima di consentire un inserimento. SalesOrderHeader potrebbe disporre di un trigger di eliminazione in grado di verificare l'assenza di righe associate in SalesOrderDetail prima di consentire un'eliminazione. I trigger non vengono presi in considerazione nella replica di tipo merge per determinare l'ordine di elaborazione degli articoli, poiché non è possibile determinare il risultato del trigger finché non viene attivato. Analogamente, nella replica non possono essere considerati i vincoli definiti a livello di applicazione.

In caso di mantenimento dell'integrità referenziale tramite trigger o a livello di applicazione, è consigliabile specificare l'ordine in cui gli articoli devono essere elaborati. Nell'esempio con i trigger, verrà specificato che la tabella SalesOrderHeader deve essere elaborata prima di SalesOrderDetail, poiché l'ordine degli articoli è basato sull'ordine di inserimento. Nella replica di tipo merge verrà automaticamente invertito l'ordine per le eliminazioni. La replica di tipo merge non avrà esito negativo se gli articoli non vengono ordinati, poiché l'agente di merge continua a elaborare gli articoli in caso di violazione di un vincolo e quindi ripete le operazioni non riuscite dopo l'elaborazione degli altri articoli. Specificando l'ordine degli articoli è semplicemente possibile evitare i successivi tentativi e l'elaborazione aggiuntiva associata. Se si specifica un ordine non corretto, ad esempio un ordine che determina l'elaborazione dei record di dettagli prima dei record di intestazione, la replica di tipo merge ripeterà l'elaborazione finché non avrà esito positivo.

Nuovo articolo

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare un valore integer che rappresenta l'ordine di elaborazione per l'articolo per @processing_order. Per altre informazioni, vedere definire un articolo.

    Nota

    Quando si creano articoli ordinati, è necessario lasciare gap tra i valori relativi all'ordine degli articoli. In questo modo risulta più agevole impostare nuovi valori in futuro. Se, ad esempio, si dispone di tre articoli per cui è necessario specificare un ordine di elaborazione fisso, impostare il valore di @processing_order su 10, 20 e 30 anziché rispettivamente su 1, 2 e 3.

Articolo esistente

  1. Per determinare l'ordine di elaborazione di un articolo, eseguire sp_helpmergearticle (Transact-SQL) e prendere nota del valore di processing_order nel set di risultati.
  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle (Transact-SQL). Specificare il valore processing_order per @property e un valore integer che rappresenta l'ordine di elaborazione per @value.