Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
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, Merge Replication elabora le modifiche dei dati riga per riga. In molte circostanze, questo approccio è appropriato, ma per alcune applicazioni è essenziale che le righe correlate vengano elaborate come un'unità. La funzione di record logici di Merge Replication permette di definire una relazione tra righe correlate in tabelle diverse in modo che le righe vengano elaborate come un'unità.
Nota
Puoi usare la funzione dei record logici da sola o insieme ai filtri di join. Per ulteriori informazioni sui filtri join, vedere Join Filters. Per utilizzare i record logici, è necessario che il livello di compatibilità della pubblicazione sia almeno 90RTM.
Si considerino le tre tabelle correlate seguenti:
La tabella Customers è la tabella padre in questa relazione e presenta una colonna chiave primaria CustID. La tabella Orders ha una colonna chiave primaria OrderID, con un vincolo di chiave esterna nella colonna CustID che fa riferimento alla colonna CustID nella tabella Customers . Analogamente, la tabella OrderItems ha una colonna chiave primaria OrderItemID, con un vincolo di chiave esterna nella colonna OrderID che fa riferimento alla colonna OrderID nella tabella Orders .
In questo esempio un record logico è composto da tutte le righe della tabella Orders correlate a un unico valore di CustID e da tutte le righe della tabella OrderItems correlate a tali righe della tabella Orders . Nel grafico seguente vengono illustrate tutte le righe delle tre tabelle che si trovano nel record logico di Customer2:
Per definire una relazione di record logici tra articoli, vedere Definire una relazione di record logici tra articoli della tabella di unione.
Vantaggi dei record logici
La funzionalità di record logici offre due vantaggi principali:
Applicazione delle modifiche ai dati come un'unica unità.
Rilevamento e risoluzione di conflitti contemporaneamente in più righe di più tabelle.
L'applicazione dei cambiamenti come unità
Se l'elaborazione del merge viene interrotta, ad esempio in caso di caduta della connessione, il processo esegue il rollback dell'insieme parzialmente completato delle relative modifiche replicate, se vengono utilizzati record logici. Si consideri, ad esempio, il caso in cui un Sottoscrittore aggiunga un nuovo ordine con OrderID = 6 e due nuove righe nella tabella OrderItems con OrderItemID = 10 e OrderItemID = 11 per OrderID = 6.
Se il processo di replicazione viene interrotto dopo che la riga OrderAmount per OrderID = 6 è completata, ma prima che gli OrderItems 10 e 11 siano completi e non vengano utilizzati i record logici, il valore OrderTotal per OrderID = 6 non è coerente con la somma dei valori OrderAmount per le righe OrderItems . Se vengono utilizzati record logici, la riga Orders per OrderID = 6 non viene confermata finché le modifiche correlate in OrderItems non vengono replicate.
In uno scenario diverso, se vengono usati record logici e qualcuno interroga le tabelle mentre il processo di fusione applica le modifiche, l'utente non vede le modifiche parzialmente replicate finché non sono tutte complete. Ad esempio, il processo di replica carica la riga Orders per OrderID = 6, ma un utente interroga le tabelle prima che il processo di replica replichi le righe OrderItems , il valore OrderTotal non è lo stesso della somma dei valori OrderAmount . Se vengono usati record logici, la riga Ordini non è visibile finché le righe OrderItems non sono completate e la transazione viene commessa come unità.
L'applicazione della gestione dei conflitti a più di una tabella
Consideriamo il caso in cui due Abbonati abbiano il set di dati precedente:
Un utente nel primo Sottoscrittore modifica il valore di OrderAmount per OrderItemID 5 da 100 a 150 e il valore di OrderTotal per OrderID 3 da 200 a 250.
Un utente nel secondo Sottoscrittore modifica il valore di OrderAmount per OrderItemID 6 da 25 a 125 e il valore di OrderTotal per OrderID 3 da 200 a 300.
Se questi cambiamenti vengono replicati senza utilizzare record logici, i diversi valori di OrderTotal causano un conflitto e solo uno di essi viene replicato. Ma le modifiche non conflittuali nella tabella OrderItems vengono replicate senza conflitti, lasciando i valori finali di OrderTotal in uno stato incoerente rispetto alle righe OrderItems . Se in questo scenario vengono utilizzati record logici, anche la modifica di OrderItems associata alla modifica della tabella Orders che risulta soccombente viene sottoposta a rollback, e il valore finale di OrderTotal è una sintesi accurata delle righe di OrderItems.
Per altre informazioni sulle opzioni correlate al rilevamento e alla risoluzione dei conflitti per i record logici, vedere Rilevamento e risoluzione dei conflitti nei record logici.
Considerazioni per l'uso dei record logici
Quando si utilizzano i record logici, tenere presenti le considerazioni seguenti:
Considerazioni generali
Mantieni il numero di tabelle in un record logico il più basso possibile. Usa cinque tavoli o meno.
I record logici non possono fare riferimento a colonne con nessuno dei seguenti tipi di dati:
varchar(max) e nvarchar(max)
varbinary(max)
text e ntext
Immagine
XML
UDT
Non puoi definire relazioni di chiave estera nelle tabelle pubblicate usando l'opzione CASCADE. Per altre informazioni, vedere CREATE TABLE (Transact-SQL) e ALTER TABLE (Transact-SQL).
Non puoi aggiornare le colonne usate nella clausola di relazione logica.
La risoluzione personalizzata dei conflitti tramite gestori della logica di business o resolver personalizzati non è supportata per gli articoli inclusi in un record logico.
Se usi record logici in una pubblicazione che include filtri parametrizzati, devi inizializzare ogni Sottoscrittore con uno snapshot per la relativa partizione. Se iniziali un Abbonato usando un altro metodo, il agente di merge fallisce. Per altre informazioni, vedere Snapshots for Merge Publications with Parameterized Filters.
I conflitti che coinvolgono registri logici non compaiono nel Visualizzatore di Conflitti. Per visualizzare informazioni su questi conflitti, utilizzare le stored procedure di replica. Per altre informazioni, vedere Visualizzare le informazioni sui conflitti per le pubblicazioni di tipo merge (programmazione Transact-SQL della replica).
Ambientazioni di pubblicazione
È necessario che la pubblicazione abbia un livello di compatibilità pari a 90RTM o superiore. Per ulteriori informazioni, consultare la sezione "Livello di compatibilità della pubblicazione" dell'argomento Compatibilità con le versioni precedenti per la replica.
È necessario che nella pubblicazione sia utilizzata la modalità snapshot nativa. Questa modalità è la predefinita, a meno che tu non stia replicando su SQL Server Compact, che non supporta i record logici.
La pubblicazione non può permettere la sincronizzazione Web. Per ulteriori informazioni sulla sincronizzazione Web, vedere Web Synchronization for Merge Replication.
Per utilizzare i record logici su una pubblicazione filtrata:
Devi anche usare partizioni precalcolate. I requisiti delle partizioni pre-calcolate si applicano anche ai record logici. Per altre informazioni, vedere Ottimizzare le prestazioni dei filtri con parametri con le partizioni pre-calcolate.
Non puoi usare filtri parametrizzati non sovrapposti. Per ulteriori informazioni, vedere la sezione Impostazione delle opzioni delle partizioni in Parameterized Row Filters.
Se la pubblicazione utilizza filtri join, devi impostare la proprietà unica della chiave join su true per tutti i filtri join coinvolti nelle relazioni di record logici. Per altre informazioni, vedere Join Filters.
Relazioni tra tabelle
È necessario che le tabelle correlate tramite record logici presentino una relazione tra chiave primaria e chiave esterna.
Non puoi impostare l'opzione NOT FOR REPLICATION per i vincoli della chiave esterna.
Le tabelle figlio possono avere solo una tabella padre.
Un database utilizzato per tenere traccia di classi e studenti potrebbe, ad esempio, avere una struttura simile alla seguente:
Non puoi usare un record logico per rappresentare le tre tabelle in questa relazione, perché le righe in ClassMembers non sono associate a una singola riga chiave primaria. Le tabelle Classes e ClassMembers potrebbero formare un record logico, così come potrebbero formarlo le tabelle ClassMembers e Students, ma non tutte e tre.
La pubblicazione non può contenere relazioni di filtro di join circolare.
Usando l'esempio con le tabelle Clienti, Ordini e OrdiniOggetti, non puoi usare i record logici se la tabella Ordini ha anche un vincolo di chiave esterna che fa riferimento alla tabella OrdiniOggetti .
Effetti dei record logici sulle prestazioni
La funzione di registrazione logica comporta un costo in prestazioni. Se non usi i record logici, l'agente di replicazione può elaborare tutte le modifiche per un dato articolo contemporaneamente. Poiché le modifiche vengono applicate riga per riga, i requisiti di blocco e log delle transazioni necessari per applicare le modifiche sono minimi.
Se usi i record logici, l'agente di merge deve elaborare insieme le modifiche per ogni intero record logico. Questo processo influisce sul tempo impiegato dall'agente di merge per replicare le righe. Inoltre, poiché l'agente apre una transazione separata per ogni record logico, i requisiti di blocco possono aumentare.