Raggruppamento di modifiche alla righe correlate con record logiciGroup Changes to Related Rows with Logical Records

Nota

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.

Per impostazione predefinita, i dati dei processi di replica di tipo merge cambiano riga per riga.By default, merge replication processes data changes on a row-by-row basis. In molti casi questo comportamento è appropriato, ma per alcune applicazioni è essenziale che le righe correlate vengano elaborate come unità.In many circumstances this is appropriate, but for some applications, it is essential that related rows be processed as a unit. La funzionalità di record logici della replica di tipo merge consente di definire una relazione tra righe correlate di tabelle diverse, in modo che le righe vengano elaborate come unità.The logical records feature of merge replication allows you to define a relationship between related rows in different tables so that the rows are processed as a unit.

Nota

La funzionalità di record logici può essere utilizzata da sola o unitamente a filtri join.The logical records feature can be used alone or in conjunction with join filters. Per ulteriori informazioni sui filtri join, vedere Join Filters.For more information about join filters, see Join Filters. Per utilizzare i record logici, è necessario che il livello di compatibilità della pubblicazione sia almeno 90RTM.To use logical records, the compatibility level of the publication must be at least 90RTM.

Si considerino le tre tabelle correlate seguenti:Consider these three related tables:

Record logico per tre tabelle solo con nomi di colonnaThree table logical record, with column names only

La tabella Customers è la tabella padre in questa relazione e presenta una colonna chiave primaria CustID.The Customers table is the parent table in this relationship and has a primary key column 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 .The Orders table has a primary key column OrderID, with a foreign key constraint on the CustID column that references the CustID column in the Customers table. 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 .Similarly, the OrderItems table has a primary key column OrderItemID, with a foreign key constraint on the OrderID column that references the OrderID column in the Orders table.

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 .In this example, a logical record consists of all the rows in the Orders table that are related to a single CustID value and all of the rows in the OrderItems table that are related to those rows in the Orders table. Nel grafico seguente vengono illustrate tutte le righe delle tre tabelle che si trovano nel record logico di Customer2:This diagram shows all the rows in the three tables that are in the logical record for Customer2:

Record logico per tre tabelle con valoriThree table logical record with values

Per definire una relazione tra record logici per gli articoli, vedere Define a Logical Record Relationship Between Merge Table Articles.To define a logical record relationship between articles, see Define a Logical Record Relationship Between Merge Table Articles.

Vantaggi dei record logiciBenefits of Logical Records

La funzionalità di record logici offre due vantaggi principali:The logical records feature has two primary benefits:

  • Applicazione delle modifiche ai dati come unità.Application of data changes as a unit.

  • Rilevamento e risoluzione di conflitti contemporaneamente in più righe di più tabelle.The detection and resolution of conflicts simultaneously on multiple rows from multiple tables.

Applicazione di modifiche come unitàThe Application of Changes As a Unit

Se l'elaborazione di tipo merge viene interrotta, ad esempio nel caso di interruzione della connessione, se sono stati utilizzati record logici, viene eseguito il rollback del set parzialmente completato di modifiche replicate correlate.If merge processing is interrupted, such as in the case of a dropped connection, the partially completed set of related replicated changes is rolled back if logical records are used. 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.For example, consider the case where a Subscriber adds a new order with OrderID = 6 and two new rows in the OrderItems table with OrderItemID = 10 and OrderItemID = 11 for OrderID = 6.

Record logico per tre tabelle con valoriThree table logical record with values

Se il processo di replica viene interrotto dopo che la riga Orders per OrderID = 6 è stata completata, ma prima che gli elementi 11 e 12 della tabella OrderItems siano completati e se i record logici non vengono utilizzati, il valore di OrderTotal per OrderID = 6 non coinciderà con la somma dei valori di OrderAmount per le righe di OrderItems .If the replication process is interrupted after the Orders row for OrderID = 6 is complete, but before the OrderItems 10 and 11 are completed, and logical records are not used, the OrderTotal value for OrderID = 6 will not be consistent with the sum of the OrderAmount values for the OrderItems rows. Se vengono utilizzati record logici, non verrà eseguito il commit della riga Orders per OrderID = 6 fino a quando le modifiche correlate nella tabella OrderItems non saranno replicate.If logical records are used, the Orders row for OrderID = 6 is not committed until the related OrderItems changes are replicated.

In uno scenario diverso, se vengono utilizzati i record logici e si esegue una query sulle tabelle mentre il processo di tipo merge sta applicando le modifiche, l'utente non vedrà le modifiche parzialmente replicate fino a quando non saranno tutte complete.In a different scenario, if logical records are used, and someone is querying tables when the merge process is applying changes, the user will not see the partially replicated changes until they are all complete. Se, ad esempio, tramite il processo di replica è stata caricata la riga Orders per OrderID = 6, ma un utente esegue una query sulle tabelle prima che tramite il processo di replica siano state replicate le righe di OrderItems , il valore di OrderTotal non sarà uguale alla somma dei valori di OrderAmount .For example, the replication process has uploaded the Orders row for OrderID = 6, but a user queries the tables before the replication process has replicated the OrderItems rows, the OrderTotal value would not be the same as the sum of the OrderAmount values. Se vengono utilizzati record logici, la riga Orders non sarà visibile fino a quando le righe di OrderItems non saranno complete e non sarà stato eseguito il commit della transazione come unità.If logical records are used, the Orders row would not be visible until the OrderItems rows are complete and the transaction has been committed as a unit.

Applicazione della gestione dei conflitti a più di una tabellaThe Application of Conflict Handling to More Than One Table

Si consideri il caso in cui due Sottoscrittori dispongono del set di dati illustrato in precedenza:Consider the case where two Subscribers have the data set above:

  • 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.A user at the first Subscriber changes the OrderAmount of OrderItemID 5 from 100 to 150 and the OrderTotal of OrderID 3 from 200 to 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.A user at the second Subscriber changes the OrderAmount of OrderItemID 6 from 25 to 125 and the OrderTotal of OrderID 3 from 200 to 300.

    Se queste modifiche vengono replicate senza utilizzare record logici, i diversi valori di OrderTotal daranno luogo a un conflitto e solo uno di essi verrà replicato.If these changes are replicated without using logical records, the different OrderTotal values would result in a conflict and only one of them would be replicated. Le modifiche non in conflitto presenti nella tabella OrderItems verranno tuttavia replicate senza alcun conflitto, lasciando i valori finali di OrderTotal in uno stato inconsistente rispetto alle righe di OrderItems .But the non-conflicting changes in the OrderItems table would be replicated without conflict, leaving the final OrderTotal values in an inconsistent state with respect to the OrderItems rows. Se in questo scenario vengono utilizzati i record logici, verrà eseguito il rollback della modifica a OrderItems associata alla modifica della tabella Orders in perdita e il valore di OrderTotal finale sarà costituito da un riepilogo accurato delle righe di OrderItems .If logical records are used in this scenario, the OrderItems change associated with the losing Orders table change would also be rolled back, and the final OrderTotal value would be an accurate summary of the OrderItems rows.

    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.For more information about options related to conflict detection and resolution with logical records, see Detecting and Resolving Conflicts in Logical Records.

Considerazioni sull'utilizzo di record logiciConsiderations for Using Logical Records

Quando si utilizzano i record logici, tenere presenti le considerazioni seguenti:Keep the following considerations in mind when using logical records.

Considerazioni generaliGeneral Considerations

  • È consigliabile che il numero di tabelle in un record logico sia il più basso possibile, ad esempio cinque tabelle o un numero inferiore.It is recommended that you keep the number of tables in a logical record as low as possible; five tables or less is recommended.

  • I record logici non possono fare riferimento a colonne con i tipi di dati seguenti:Logical records cannot reference columns with any of the following data types:

    • varchar(max) e nvarchar(max)varchar(max) and nvarchar(max)

    • varbinary(max)varbinary(max)

    • text e ntexttext and ntext

    • imageimage

    • XMLXML

    • UDTUDT

  • Le relazioni di chiavi esterne nelle tabelle pubblicate non possono essere definite mediante l'opzione CASCADE.Foreign key relationships in published tables cannot be defined with the CASCADE option. Per altre informazioni, vedere CREATE TABLE (Transact-SQL) e ALTER TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL) and ALTER TABLE (Transact-SQL).

  • Non è possibile aggiornare le colonne utilizzate nella clausola di relazione logica.You cannot update any columns that are used in the logical relation clause.

  • La risoluzione dei conflitti personalizzata con gestori della logica di business o sistemi di risoluzione personalizzati non è supportata per gli articoli inclusi in un record logico.Custom conflict resolution with business logic handlers or custom resolvers is not supported for articles that are included in a logical record.

  • Se in una pubblicazione che include filtri con parametri vengono utilizzati record logici, è necessario inizializzare ogni Sottoscrittore con uno snapshot per la relativa partizione.If logical records are used in a publication that includes parameterized filters, you must initialize each Subscriber with a snapshot for its partition. Se si inizializza un Sottoscrittore con un altro metodo, l'agente di merge non verrà eseguito in modo corretto.If you initialize a Subscriber with another method, the Merge Agent will fail. Per altre informazioni, vedere Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

  • I conflitti a livello di record logici non vengono visualizzati nel Visualizzatore conflitti.Conflicts that involve logical records are not displayed in Conflict Viewer. Per visualizzare informazioni relative a questi conflitti, utilizzare le stored procedure di replica.To view information about these conflicts, use replication stored procedures. Per altre informazioni, vedere Visualizzare le informazioni sui conflitti per le pubblicazioni di tipo merge (programmazione Transact-SQL della replica).For more information, see View Conflict Information for Merge Publications (Replication Transact-SQL Programming).

Impostazioni di pubblicazionePublication Settings

  • È necessario che la pubblicazione abbia un livello di compatibilità pari a 90RTM o superiore.The publication must have a compatibility level of 90RTM or greater. Per altre informazioni, vedere la sezione "Livello di compatibilità della pubblicazione" in Compatibilità con le versioni precedenti della replica.For more information, see the "Publication Compatibility Level" section of Replication Backward Compatibility.

  • È necessario che nella pubblicazione sia utilizzata la modalità snapshot nativa.The publication must use native snapshot mode. Si tratta dell'impostazione predefinita a meno che non si esegua la replica in SQL Server CompactSQL Server Compact, che non supporta i record logici.This is the default unless you are replicating to SQL Server CompactSQL Server Compact, which does not support logical records.

  • La pubblicazione non consente la sincronizzazione tramite il Web.The publication cannot allow Web synchronization. Per ulteriori informazioni sulla sincronizzazione Web, vedere Web Synchronization for Merge Replication.For more information about Web synchronization, see Web Synchronization for Merge Replication.

  • Per utilizzare record logici in una pubblicazione filtrata:In order to use logical records on a filtered publication:

  • Se nella pubblicazione sono utilizzati filtri join, è necessario che la proprietà join unique key sia impostata su true per tutti i filtri join coinvolti in relazioni tra record logici.If the publication uses join filters, the join unique key property must be set to true for all join filters that are involved in logical record relationships. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

Relazioni tra tabelleRelationships Between Tables

  • È necessario che le tabelle correlate tramite record logici presentino una relazione tra chiave primaria e chiave esterna.Tables related through logical records must have a primary key-foreign key relationship.

  • Non è possibile impostare l'opzione NOT FOR REPLICATION per i vincoli di chiave esterna.The NOT FOR REPLICATION option cannot be set for foreign key constraints.

  • Le tabelle figlio possono avere solo una tabella padre.Child tables can have only one parent table.

    Un database utilizzato per tenere traccia di classi e studenti potrebbe, ad esempio, avere una struttura simile alla seguente:For example, a database tracking classes and students might have a design similar to:

    Tabella figlio con più di una tabella padreChild table with more than one parent table

    Non è possibile utilizzare un record logico per rappresentare le tre tabelle di questa relazione, in quanto le righe in ClassMembers non sono associate a una singola riga chiave primaria.You cannot use a logical record to represent the three tables in this relationship, because the rows in ClassMembers are not associated with a single primary key row. Le tabelle Classes e ClassMembers potrebbero formare un record logico, così come potrebbero formarlo le tabelle ClassMembers e Students, ma non tutte e tre.The tables Classes and ClassMembers could still form a logical record, as could the tables ClassMembers and Students, but not all three.

  • La pubblicazione non può contenere relazioni circolari tra filtri join.The publication cannot contain circular join filter relationships.

    Utilizzando l'esempio con le tabelle Customers, Orderse OrderItems, non è possibile utilizzare record logici se la tabella Orders presenta anche un vincolo di chiave esterna che fa riferimento alla tabella OrderItems .Using the example with the tables Customers, Orders, and OrderItems, you could not use logical records if the Orders table also had a foreign key constraint that referenced the OrderItems table.

Effetti dei record logici sulle prestazioniPerformance implications of logical records

La funzionalità di record logici comporta alcuni costi relativi alle prestazioni.The logical record feature does come with a performance cost. Se non vengono utilizzati record logici, l'agente di replica può elaborare contemporaneamente tutte le modifiche relative a un determinato articolo e poiché le modifiche vengono applicate riga per riga, i requisiti del log delle transazioni e di blocco necessari per l'applicazione di tali modifiche sono minimi.If logical records are not used, the replication agent can process all of the changes for a given article at the same time, and because the changes are applied in a row-by-row fashion, the locking and transaction log requirements necessary for applying the changes are minimal.

Se vengono utilizzati record logici, è necessario che l'agente di merge elabori insieme le modifiche per ogni record logico completo.If logical records are used, the Merge Agent must process the changes for each entire logical record together. Questa operazione influisce sulla quantità di tempo necessaria per la replica delle righe da parte dell'agente di merge.This has an effect on the amount of time it takes the Merge Agent to replicate the rows. Poiché, inoltre, tramite l'agente viene aperta una transazione separata per ogni record logico, i requisiti di blocco possono aumentare.Additionally, because the agent opens a separate transaction for each logical record, locking requirements can increase.

Vedere ancheSee Also

Opzioni degli articoli per la replica di tipo mergeArticle Options for Merge Replication