Sottoscrizioni aggiornabili - Per la replica transazionaleUpdatable Subscriptions - For Transactional Replication

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)noDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Nota

Questa funzionalità continuerà a essere supportata nelle versioni di SQL ServerSQL Server dalla 2012 alla 2016.This feature remains supported in versions of SQL ServerSQL Server from 2012 through 2016. Questa funzionalità verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

La replica transazionale supporta gli aggiornamenti dei Sottoscrittori attraverso le sottoscrizioni aggiornabili e la replica peer-to-peer.Transactional replication supports updates at Subscribers through updatable subscriptions and peer-to-peer replication. Di seguito sono indicati i due tipi di sottoscrizioni aggiornabili:The following are the two types of updatable subscriptions:

  • Aggiornamento immediato.Immediate updating. Per l'aggiornamento dei dati nel Sottoscrittore è necessario che il server di pubblicazione e il Sottoscrittore siano connessi.The Publisher and Subscriber must be connected to update data at the Subscriber.

  • Aggiornamento in coda. Per l'aggiornamento dei dati nel Sottoscrittore non è necessario che il server di pubblicazione e il Sottoscrittore siano connessi.Queued updating The Publisher and Subscriber do not have to be connected to update data at the Subscriber. È possibile eseguire gli aggiornamenti mentre il Sottoscrittore o il server di pubblicazione è offline.Updates can be made while the Subscriber or Publisher is offline.

    Quando si aggiornano i dati in un Sottoscrittore, questi vengono innanzitutto propagati al server di pubblicazione e quindi agli altri Sottoscrittori.When data is updated at a Subscriber, it is first propagated to the Publisher and then propagated to other Subscribers. Se si utilizza l'aggiornamento immediato, le modifiche vengono propagate immediatamente tramite il protocollo di commit in due fasi.If immediate updating is used, the changes are propagated immediately using the two-phase commit protocol. Se si utilizza l'aggiornamento in coda, le modifiche vengono archiviate in una coda. Le transazioni in coda vengono quindi applicate in modo asincrono nel server di pubblicazione ogni volta che è disponibile la connettività di rete.If queued updating is used, the changes are stored in a queue; the queued transactions are then applied asynchronously at the Publisher whenever network connectivity is available. Poiché gli aggiornamenti vengono propagati in modo asincrono al server di pubblicazione, gli stessi dati potrebbero essere stati aggiornati dal server di pubblicazione o da un altro Sottoscrittore e potrebbero verificarsi conflitti in fase di applicazione degli aggiornamenti.Because the updates are propagated asynchronously to the Publisher, the same data may have been updated by the Publisher or by another Subscriber and conflicts can occur when applying the updates. I conflitti vengono rilevati e risolti in base a criteri di risoluzione dei conflitti impostati durante la creazione della pubblicazione.Conflicts are detected and resolved according to a conflict resolution policy that is set when creating the publication.

    Se si crea una pubblicazione transazionale con sottoscrizioni aggiornabili tramite la Creazione guidata nuova pubblicazione, verranno abilitati sia l'aggiornamento immediato che l'aggiornamento in coda.If you create a transactional publication with updatable subscriptions in the New Publication Wizard, both immediate updating and queued updating are enabled. Se si crea una pubblicazione con stored procedure, è possibile abilitare una o entrambe le opzioni.If you create a publication with stored procedures, you can enable one or both options. Quando si crea una sottoscrizione della pubblicazione, è necessario specificare la modalità di aggiornamento da utilizzare.When you create a subscription to the publication, you specify which update mode to use. Se necessario, sarà quindi possibile passare da una modalità di aggiornamento all'altra.You can then switch between update modes if necessary. Per ulteriori informazioni, vedere la sezione seguente "Passaggio da una modalità di aggiornamento all'altra".For more information, see the following section "Switching between Update Modes".

    Per abilitare le sottoscrizioni aggiornabili per le pubblicazioni transazionali, Enable Updating Subscriptions for Transactional PublicationsTo enable updatable subscriptions for transactional publications, Enable Updating Subscriptions for Transactional Publications

    Per creare sottoscrizioni aggiornabili per le pubblicazioni transazionali, vedere Creare una sottoscrizione aggiornabile di una pubblicazione transazionale (Management Studio)To create updatable subscriptions for transactional publications, see Create an Updatable Subscription to a Transactional Publication (Management Studio)

Passaggio da una modalità di aggiornamento all'altraSwitching Between Update Modes

Quando si utilizzano le sottoscrizioni aggiornabili, è possibile specificare che per una sottoscrizione venga utilizzata una modalità di aggiornamento e quindi si passi all'altra se l'applicazione lo richiede.When using updatable subscriptions you can specify that a subscription should use one update mode and then switch to the other if the application requires it. È possibile, ad esempio, specificare che per una sottoscrizione venga utilizzato l'aggiornamento immediato, ma si passi all'aggiornamento in coda se un errore di sistema provoca la perdita della connettività di rete.For example, you can specify that a subscription should use immediate updating, but switch to queued updating if a system failure results in the loss of network connectivity.

Nota

La replica non passa automaticamente da una modalità di aggiornamento all'altra.Replication does not switch automatically between update modes. Per passare da una modalità all'altra, è necessario impostare la modalità di aggiornamento tramite SQL Server Management Studio oppure l'applicazione deve chiamare sp_setreplfailovermode (Transact-SQL).You must set the update mode through SQL Server Management Studio or your application must call sp_setreplfailovermode (Transact-SQL) to switch between modes.

Se si passa dall'aggiornamento immediato all'aggiornamento in coda, non sarà possibile tornare all'aggiornamento immediato fino a quando il Sottoscrittore e il server di pubblicazione non sono connessi e tramite l'agente di lettura coda non sono stati applicati al server di pubblicazione tutti i messaggi in sospeso nella coda.If you switch from immediate updating to queued updating, you cannot switch back to immediate updating until the Subscriber and Publisher are connected and the Queue Reader Agent has applied all pending messages in the queue to the Publisher.

Per passare da una modalità di aggiornamento all'altraTo switch between update modes

Per passare da una modalità di aggiornamento all'altra, è necessario abilitare la pubblicazione e la sottoscrizione per entrambe le modalità e quindi passare da una all'altra, se necessario.To switch between updating modes, you must enable the publication and subscription for both update modes, and then switch between them if necessary. Per altre informazioni, vedereFor more information, see
Switch Between Update Modes for an Updatable Transactional Subscription.Switch Between Update Modes for an Updatable Transactional Subscription.

Considerazioni per l'utilizzo di sottoscrizioni aggiornabiliConsiderations for Using Updatable Subscriptions

  • Dopo avere abilitato una pubblicazione per le sottoscrizioni aggiornabili o per le sottoscrizioni ad aggiornamento in coda, non sarà possibile disabilitare l'opzione per la pubblicazione, anche nel caso in cui non sia necessaria per le sottoscrizioni.After a publication is enabled for updating subscriptions or queued updating subscriptions, the option cannot be disabled for the publication (although subscriptions do not need to use it). Per disabilitare l'opzione, è necessario eliminare la pubblicazione e crearne una nuova.To disable the option, the publication must be deleted and a new one created.

  • La ripubblicazione dei dati non è supportata.Republishing data is not supported.

  • La replica aggiunge la colonna msrepl_tran_version alle tabelle pubblicate per consentire il rilevamento.Replication adds the msrepl_tran_version column to published tables for tracking purposes. A causa di questa colonna aggiuntiva, tutte le istruzioni INSERT devono includere un elenco di colonne.Because of this additional column, all INSERT statements should include a column list.

  • Per apportare modifiche allo schema in una tabella di una pubblicazione che supporta le sottoscrizioni aggiornabili, è necessario arrestare tutte le attività nella tabella nel server di pubblicazione e nei Sottoscrittori e propagare a tutti i nodi le modifiche ai dati in sospeso prima di apportare modifiche allo schema.To make schema changes on a table in a publication that supports updating subscriptions, all activity on the table must be stopped at the Publisher and Subscribers, and pending data changes must be propagated to all nodes before making any schema changes. In questo modo le transazioni in sospeso non entrano in conflitto con le modifiche allo schema in sospeso.This ensures that outstanding transactions do not conflict with the pending schema change. Dopo avere propagato a tutti i nodi le modifiche dello schema, è possibile riprendere le attività nelle tabelle pubblicate.After the schema changes have propagated to all nodes, activity can resume on the published tables. Per altre informazioni, vedere Come mettere una topologia di replica in stato di inattività (programmazione Transact-SQL della replica).For more information, see Quiesce a Replication Topology (Replication Transact-SQL Programming).

  • Se si prevede di passare da una modalità di aggiornamento all'altra, è necessario eseguire l'agente di lettura coda almeno una volta dopo l'inizializzazione della sottoscrizione. Per impostazione predefinita, l'agente di lettura coda viene eseguito continuamente.If you plan to switch between update modes, the Queue Reader Agent must run at least once after the subscription has been initialized (by default, the Queue Reader Agent runs continuously).

  • Se il database del Sottoscrittore è partizionato orizzontalmente e nella partizione vi sono righe presenti nel Sottoscrittore ma non nel server di pubblicazione, il Sottoscrittore non potrà aggiornare tali righe.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber, but not at the Publisher, the Subscriber cannot update the preexisting rows. I tentativi di aggiornamento di queste righe generano un errore.Attempting to update these rows returns an error. In questi casi è necessario eliminare le righe dalla tabella e quindi aggiungerle nel server di pubblicazione.The rows should be deleted from the table and then added at the Publisher.

  • La replica transazionale con Sottoscrittori aggiornabili in coda potrebbe subire un rallentamento delle prestazioni quando si usano indici filtrati univoci.Transactional replication with Queued updateable subscribers could experience slow performance when unique filtered indexes are used. Se si verifica un conflitto in un articolo con indici filtrati univoci, la risoluzione dei conflitti comporterebbe ulteriori eliminazioni e inserimenti nel Sottoscrittore per le righe non incluse dall'indice filtrato univoco.If a conflict occurs on an article that has unique filtered indexes then conflict resolution would lead to additional deletes and inserts on the subscriber for the rows that are not covered by the unique filtered index.

Aggiornamenti nel SottoscrittoreUpdates at the Subscriber

  • Gli aggiornamenti nel Sottoscrittore vengono propagati al server di pubblicazione, anche se una sottoscrizione è scaduta o inattiva.Updates at the Subscriber are propagated to the Publisher even if a subscription is expired or is inactive. Verificare che tali sottoscrizioni vengano eliminate o reinizializzate.Ensure that any such subscriptions are either dropped or reinitialized.

  • Se le colonne TIMESTAMP o IDENTITY vengono usate e replicate come tipi di dati di base, i valori contenuti non devono essere aggiornati nel sottoscrittore.If TIMESTAMP or IDENTITY columns are used, and they are replicated as their base data types, values in these columns should not be updated at the Subscriber.

  • I sottoscrittori non possono aggiornare o inserire valori text, ntext o image perché non è possibile leggere dalle tabelle inserite o eliminate all'interno dei trigger di rilevamento modifiche della replica.Subscribers cannot update or insert text, ntext or image values because it is not possible to read from the inserted or deleted tables inside the replication change-tracking triggers. In modo analogo, i sottoscrittori non possono aggiornare o inserire valori text o image tramite WRITETEXT o UPDATETEXT perché i dati vengono sovrascritti dal server di pubblicazione.Similarly, Subscribers cannot update or insert text or image values using WRITETEXT or UPDATETEXT because the data is overwritten by the Publisher. È invece possibile partizionare le colonne text e image in una tabella distinta e modificare le due tabelle all'interno di una transazione.Instead, you could partition the text and image columns into a separate table and modify the two tables within a transaction.

    Per aggiornare gli oggetti di grandi dimensioni in un sottoscrittore, usare i tipi di dati varchar(max), nvarchar(max), varbinary(max) anziché, rispettivamente, text, ntext, e image .To update large objects at a Subscriber, use the data types varchar(max), nvarchar(max), varbinary(max) instead of text, ntext, and image data types, respectively.

  • Gli aggiornamenti delle chiavi univoche, incluse le chiavi primarie, che generano duplicati, ad esempio, un aggiornamento del form UPDATE <column> SET <column> =<column>+1 , non sono consentiti e vengono rifiutati in quanto violazioni dell'univocità.Updates to unique keys (including primary keys) that generate duplicates (for example, an update of the form UPDATE <column> SET <column> =<column>+1 are not allowed and will be rejected because of a uniqueness violation. Questo avviene perché gli aggiornamenti dei set eseguiti nel sottoscrittore vengono propagati tramite replica come singole istruzioni UPDATE per tutte le righe interessate.This is because set updates made at the Subscriber are propagated by replication as individual UPDATE statements for each row affected.

  • Se il database del Sottoscrittore è partizionato orizzontalmente e nella partizione vi sono righe presenti nel Sottoscrittore ma non nel server di pubblicazione, il Sottoscrittore non potrà aggiornare tali righe.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber but not at the Publisher, the Subscriber cannot update the pre-existing rows. I tentativi di aggiornamento di queste righe generano un errore.Attempting to update these rows returns an error. In questi casi è necessario eliminare le righe dalla tabella e inserirle di nuovo.The rows should be deleted from the table and inserted again.

Trigger definiti dall'utenteUser-defined Triggers

  • Se per l'applicazione sono necessari trigger nel sottoscrittore, i trigger devono essere definiti con l'opzione NOT FOR REPLICATION nel server di pubblicazione e nel sottoscrittore.If the application requires triggers at the Subscriber, the triggers should be defined with the NOT FOR REPLICATION option at the Publisher and Subscriber. In questo modo, i trigger vengono attivati solo per modifiche ai dati originali, ma non quando le modifiche vengono replicate.This ensures that triggers fire only for the original data change, but not when that change is replicated.

    Verificare che il trigger definito dall'utente non venga attivato quando il trigger di replica aggiorna la tabella.Ensure that the user-defined trigger does not fire when the replication trigger updates the table. A tale scopo, chiamare la procedura sp_check_for_sync_trigger nel corpo del trigger definito dall'utente.This is accomplished by calling the procedure sp_check_for_sync_trigger in the body of the user-defined trigger. Per altre informazioni, vedere sp_addlinkedserver (Transact-SQL).For more information, see sp_check_for_sync_trigger (Transact-SQL).

Aggiornamento immediatoImmediate Updating

  • Per le sottoscrizioni ad aggiornamento immediato, le modifiche nel Sottoscrittore vengono propagate al server di pubblicazione e applicate tramite Microsoft Distributed Transaction Coordinator (MS DTC).For immediate updating subscriptions, changes at the Subscriber are propagated to the Publisher and applied using Microsoft Distributed Transaction Coordinator (MS DTC). Verificare che MS DTC sia installato e configurato nel server di pubblicazione e nel Sottoscrittore.Ensure that MS DTC is installed and configured at the Publisher and Subscriber. Per ulteriori informazioni, vedere la documentazione di Windows.For more information, see the Windows documentation.

  • Per i trigger utilizzati dalle sottoscrizioni ad aggiornamento immediato, per replicare le modifiche è necessaria una connessione al server di pubblicazione.The triggers used by immediate updating subscriptions require a connection to the Publisher to replicate changes.

  • Se la pubblicazione consente le sottoscrizioni ad aggiornamento immediato e un articolo nella pubblicazione contiene un filtro colonne, non è possibile escludere tramite il filtro le colonne che non ammettono valori Null senza valori predefiniti.If the publication allows immediate updating subscriptions and an article in the publication has a column filter, you cannot filter out non-nullable columns without defaults.

Aggiornamento in codaQueued Updating

  • Le tabelle incluse in una pubblicazione di tipo merge non possono essere pubblicate anche come parte di una pubblicazione transazionale che consente le sottoscrizioni ad aggiornamento in coda.Tables included in a merge publication cannot also be published as part of a transactional publication that allows queued updating subscriptions.

  • La chiave primaria viene utilizzata come indicatore di posizione dei record per tutte le query, pertanto non è consigliabile apportare aggiornamenti a colonne chiave primaria quando si utilizza l'aggiornamento in coda.Updates made to primary key columns are not recommended when using queued updating because the primary key is used as a record locator for all queries. Quando i criteri di risoluzione dei conflitti sono impostati su Prevale il Sottoscrittore, è necessario prestare attenzione durante l'aggiornamento delle chiavi primarie.When the conflict resolution policy is set to Subscriber Wins, updates to primary keys should be made with caution. Se gli aggiornamenti alla chiave primaria vengono eseguiti sia nel Sottoscrittore che nel server di pubblicazione, si ottengono due righe con chiavi primarie diverse.If updates to the primary key are made at both the Publisher and at the Subscriber, the result will be two rows with different primary keys.

  • Per le colonne del tipo di dati SQL_VARIANT:, quando i dati vengono inseriti o aggiornati nel sottoscrittore, ne viene eseguito il mapping dall'agente di lettura coda quando vengono copiati dal sottoscrittore alla coda nel modo illustrato di seguito:For columns of data type SQL_VARIANT: when data is inserted or updated at the Subscriber, it is mapped in the following way by the Queue Reader Agent when it is copied from the Subscriber to the queue:

    • Viene eseguito il mapping diBIGINT, DECIMAL, NUMERIC, MONEYe SMALLMONEY a NUMERIC.BIGINT, DECIMAL, NUMERIC, MONEY, and SMALLMONEY are mapped to NUMERIC.

    • Viene eseguito il mapping diBINARY e VARBINARY ai dati VARBINARY .BINARY and VARBINARY are mapped to VARBINARY data.

Rilevamento e risoluzione di conflittiConflict Detection and Resolution

  • Per i criteri di risoluzione dei conflitti Prevale il Sottoscrittore: la risoluzione dei conflitti non è supportata per gli aggiornamenti alle colonne chiave primaria.For the Subscriber Wins conflict policy: conflict resolution is not supported for updates to primary key columns.

  • I conflitti provocati dagli errori relativi ai vincoli di chiave esterna non vengono risolti dalla replica:Conflicts due to foreign key constraint failures are not resolved by replication:

    • Se non si prevedono conflitti e i dati sono partizionati correttamente, ovvero se i Sottoscrittori non aggiornano le stesse righe, è possibile utilizzare vincoli di chiave esterna nel server di pubblicazione e nel Sottoscrittore.If conflicts are not expected and data is well partitioned (Subscribers do not update the same rows), you can use foreign key constraints on the Publisher and Subscribers.

    • Se si prevedono conflitti, quando si utilizza l'opzione di risoluzione dei conflitti "Prevale il Sottoscrittore", è consigliabile non utilizzare vincoli di chiave esterna nel server di pubblicazione e nel Sottoscrittore, mentre, quando si utilizza l'opzione di risoluzione dei conflitti "Prevale il server di pubblicazione", è consigliabile non utilizzare vincoli di chiave esterna nel Sottoscrittore.If conflicts are expected: you should not use foreign key constraints at the Publisher or Subscriber if you use "Subscriber wins" conflict resolution; you should not use foreign key constraints at the Subscriber if you use "Publisher wins" conflict resolution.

Vedere ancheSee Also

Replica transazionale peer-to-peer Peer-to-Peer Transactional Replication
Tipi di pubblicazioni per la replica transazionale Publication Types for Transactional Replication
Pubblicare dati e oggetti di database Publish Data and Database Objects
Sottoscrivere le pubblicazioni Subscribe to Publications