Regrouper les modifications apportées à des lignes connexes à l'aide d'enregistrements logiquesGroup Changes to Related Rows with Logical Records

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure Synapse Analytics (SQL DW) nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Notes

Cette fonctionnalité est en mode de maintenance et risque d’être supprimée dans une prochaine version de Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Par défaut, la réplication de fusion traite les modifications de données ligne par ligne.By default, merge replication processes data changes on a row-by-row basis. Dans de nombreux cas, c'est parfaitement justifié mais pour certaines applications, il est primordial de traiter les lignes connexes en tant qu'unité.In many circumstances this is appropriate, but for some applications, it is essential that related rows be processed as a unit. La fonctionnalité d'enregistrements logiques de la réplication de fusion permet de définir une relation entre des lignes connexes de différentes tables afin que les lignes soient traitées en tant qu'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.

Notes

Cette fonctionnalité peut être utilisée seule ou avec des filtres de jointure.The logical records feature can be used alone or in conjunction with join filters. Pour plus d'informations sur les filtres de jointure, consultez Join Filters.For more information about join filters, see Join Filters. Pour utiliser les enregistrements logiques, le niveau de compatibilité de la publication doit être au minimum égal à 90RTM.To use logical records, the compatibility level of the publication must be at least 90RTM.

Prenons l'exemple des trois tables liées suivantes :Consider these three related tables:

Enregistrement logique impliquant trois tables, avec les noms de colonnes uniquementThree table logical record, with column names only

La table Customers est la table parent dans cette relation et possède une colonne clé primaire CustID.The Customers table is the parent table in this relationship and has a primary key column CustID. La table Orders possède une colonne clé primaire OrderID, avec une contrainte de clé étrangère sur la colonne CustID qui fait référence à la colonne CustID de la table 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. De la même façon, la table OrderItems possède une colonne clé primaire OrderItemID, avec une contrainte de clé étrangère sur la colonne OrderID qui fait référence à la colonne OrderID de la table 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.

Dans cet exemple, un enregistrement logique est constitué de toutes les lignes de la table Orders associées à une valeur CustID unique et de toutes les lignes de la table OrderItems associées aux lignes de la table 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. Ce diagramme illustre toutes les lignes des trois tables figurant dans l'enregistrement logique de Customer2 :This diagram shows all the rows in the three tables that are in the logical record for Customer2:

Enregistrement logique impliquant trois tables avec valeursThree table logical record with values

Pour définir une relation d'enregistrement logique entre articles, consultez Définir une relation d'enregistrement logique entre des articles de table de fusion.To define a logical record relationship between articles, see Define a Logical Record Relationship Between Merge Table Articles.

Avantages des enregistrements logiquesBenefits of Logical Records

La fonctionnalité des enregistrements logiques possède essentiellement deux avantages :The logical records feature has two primary benefits:

  • Application des modifications de données en tant qu'unité.Application of data changes as a unit.

  • Détection et résolution de conflits simultanément sur plusieurs lignes de plusieurs tables.The detection and resolution of conflicts simultaneously on multiple rows from multiple tables.

Application des modifications en tant qu'unitéThe Application of Changes As a Unit

Si le traitement de fusion est interrompu, par exemple en cas d'abandon de la connexion, le jeu partiellement exécuté de modifications répliquées liées est restauré lorsque vous utilisez les enregistrements logiques.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. Prenons l'exemple d'un Abonné qui ajoute une nouvelle commande ( OrderID = 6) et deux nouvelles lignes dans la table OrderItems ( OrderItemID = 10 et OrderItemID = 11) pour 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.

Enregistrement logique impliquant trois tables avec valeursThree table logical record with values

Si le processus de réplication est interrompu après l'exécution de la ligne Orders de OrderID = 6 mais avant la fin de l'exécution de OrderItems 10 et 11 et que vous n'utilisez pas les enregistrements logiques, la valeur OrderTotal pour OrderID = 6 ne correspondra pas à la somme des valeurs OrderAmount des lignes 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. Si vous utilisez les enregistrements logiques, la ligne Orders de OrderID = 6 n'est pas validée tant que les modifications de OrderItems liées ne sont pas répliquées.If logical records are used, the Orders row for OrderID = 6 is not committed until the related OrderItems changes are replicated.

Dans un autre scénario, si les enregistrements logiques sont utilisés et qu'un utilisateur interroge les tables pendant l'application de modifications par le processus de fusion, il ne voit les modifications partiellement répliquées qu'à partir du moment où elles sont toutes terminées.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. Imaginons que le processus de réplication a téléchargé la ligne Orders de OrderID = 6 mais qu'un utilisateur interroge les tables avant que le processus de réplication ait répliqué les lignes OrderItems : la valeur de OrderTotal ne correspondra pas à la somme des valeurs de 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. Si vous utilisez des enregistrements logiques, la ligne Orders ne sera pas visible tant que les lignes OrderItems ne sont pas terminées et que la transaction n'a pas été validée en tant qu'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.

Application de la gestion des conflits à plusieurs tablesThe Application of Conflict Handling to More Than One Table

Envisageons le cas où deux Abonnés disposent du dataset ci-dessus :Consider the case where two Subscribers have the data set above:

  • Un utilisateur du premier Abonné remplace la valeur 100 figurant dans OrderAmount de OrderItemID 5 par 150 et la valeur 200 figurant dans OrderTotal de OrderID 3 par 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 utilisateur du deuxième Abonné remplace la valeur 25 figurant dans OrderAmount de OrderItemID 6 par 125 et la valeur 200 figurant dans OrderTotal de OrderID 3 par 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.

Si ces modifications sont répliquées sans utiliser d'enregistrement logique, les différentes valeurs de OrderTotal se traduisent par un conflit et seule l'une d'elles est répliquée.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. Mais les modifications non conflictuelles apportées à la table OrderItems seront répliquées sans conflit, avec pour conséquence une incohérence des valeurs finales de OrderTotal par rapport aux lignes 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. Si vous utilisez des enregistrements logiques dans ce scénario, la modification de OrderItems associée à la modification perdante de la table Orders sera également restaurée et la valeur finale de OrderTotal représentera la synthèse exacte des lignes 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.

Pour plus d’informations sur la détection et la résolution des conflits avec des enregistrements logiques, consultez Détection et résolution des conflits dans les enregistrements logiques.For more information about options related to conflict detection and resolution with logical records, see Detecting and Resolving Conflicts in Logical Records.

Considérations sur l'utilisation des enregistrements logiquesConsiderations for Using Logical Records

Les éléments suivants doivent être pris en compte lors de l'utilisation d'enregistrements logiques.Keep the following considerations in mind when using logical records.

Considérations généralesGeneral Considerations

  • Il est recommandé de limiter au maximum le nombre de tables dans un enregistrement logique : cinq tables ou moins.It is recommended that you keep the number of tables in a logical record as low as possible; five tables or less is recommended.

  • Les enregistrements logiques ne peuvent pas référencer des colonnes contenant l'un des types de données suivants :Logical records cannot reference columns with any of the following data types:

    • varchar(max) et nvarchar(max)varchar(max) and nvarchar(max)

    • varbinary(max)varbinary(max)

    • text et ntexttext and ntext

    • imageimage

    • XMLXML

    • UDTUDT

  • Les relations de clé étrangère dans les tables publiées ne peuvent pas être définies avec l'option CASCADE.Foreign key relationships in published tables cannot be defined with the CASCADE option. Pour plus d’informations, consultez CREATE TABLE (Transact-SQL) et ALTER TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL) and ALTER TABLE (Transact-SQL).

  • Vous ne pouvez pas mettre à jour des colonnes utilisées dans la clause de relation logique.You cannot update any columns that are used in the logical relation clause.

  • La résolution de conflits personnalisée avec des gestionnaires de logique métier ou des outils de résolution personnalisés n'est pas prise en charge pour les articles inclus dans un enregistrement logique.Custom conflict resolution with business logic handlers or custom resolvers is not supported for articles that are included in a logical record.

  • Si des enregistrements logiques sont utilisés dans une publication qui comprend des filtres paramétrés, vous devez initialiser chaque Abonné avec un instantané de sa partition.If logical records are used in a publication that includes parameterized filters, you must initialize each Subscriber with a snapshot for its partition. Si vous initialisez un Abonné avec une autre méthode, l'Agent de fusion échoue.If you initialize a Subscriber with another method, the Merge Agent will fail. Pour plus d’informations, voir Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

  • Les conflits qui concernent des enregistrements logiques ne sont pas affichés dans l'Outil de résolution des conflits.Conflicts that involve logical records are not displayed in Conflict Viewer. Pour afficher des informations sur ces conflits, utilisez des procédures stockées de réplication.To view information about these conflicts, use replication stored procedures. Pour plus d’informations, consultez Afficher les informations relatives aux conflits pour les publications de fusion (programmation Transact-SQL de la réplication).For more information, see View Conflict Information for Merge Publications (Replication Transact-SQL Programming).

Paramètres de la publicationPublication Settings

  • La publication doit présenter un niveau de compatibilité supérieur ou égal à 90RTM.The publication must have a compatibility level of 90RTM or greater. Pour plus d’informations, consultez la section « Niveau de compatibilité de la publication » dans Compatibilité descendante de la réplication.For more information, see the "Publication Compatibility Level" section of Replication Backward Compatibility.

  • La publication doit utiliser le mode d'instantané natif.The publication must use native snapshot mode. Ceci est le mode par défaut sauf lorsque vous effectuez une réplication vers SQL Server CompactSQL Server Compact, qui ne prend pas en charge les enregistrements logiques.This is the default unless you are replicating to SQL Server CompactSQL Server Compact, which does not support logical records.

  • La publication n'autorise pas la synchronisation Web.The publication cannot allow Web synchronization. Pour plus d'informations sur la synchronisation Web, consultez Web Synchronization for Merge Replication.For more information about Web synchronization, see Web Synchronization for Merge Replication.

  • Pour utiliser des enregistrements logiques sur une publication filtrée :In order to use logical records on a filtered publication:

  • Si la publication utilise des filtres de jointure, la propriété join unique key doit avoir la valeur true pour tous les filtres de jointure intervenant dans des relations d'enregistrement logique.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. Pour plus d’informations, voir Join Filters.For more information, see Join Filters.

Relations entre tablesRelationships Between Tables

  • Les tables liées par l'intermédiaire d'enregistrements logiques doivent avoir une relation clé primaire-clé étrangère.Tables related through logical records must have a primary key-foreign key relationship.

  • L'option NOT FOR REPLICATION ne peut pas être définie pour des contraintes de clé étrangère.The NOT FOR REPLICATION option cannot be set for foreign key constraints.

  • Les tables enfants ne peuvent avoir qu'une table parent.Child tables can have only one parent table.

    Par exemple, une base de données effectuant un suivi des classes et des étudiants peut présenter une conception similaire à :For example, a database tracking classes and students might have a design similar to:

    Table enfant avec plusieurs tables parentesChild table with more than one parent table

    Vous ne pouvez pas utiliser un enregistrement logique pour représenter les trois tables de cette relation car les lignes de ClassMembers ne sont pas associées à une ligne de clé primaire unique.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. Les tables Classes et ClassMembers peuvent néanmoins constituer un enregistrement logique, de même que les tables ClassMembers et Studentsmais pas les trois ensemble.The tables Classes and ClassMembers could still form a logical record, as could the tables ClassMembers and Students, but not all three.

  • La publication ne peut pas contenir des relations de filtre de jointure circulaires.The publication cannot contain circular join filter relationships.

    Dans l'exemple des tables Customers, Orderset OrderItems, vous ne pourriez pas utiliser des enregistrements logiques si la table Orders possèdait également une contrainte de clé étrangère qui faisait référence à la table 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.

Impact des enregistrements logiques sur les performancesPerformance implications of logical records

La fonctionnalité d'enregistrement logique a une incidence sur les performances.The logical record feature does come with a performance cost. Si vous n'utilisez pas les enregistrements logiques, l'Agent de réplication peut traiter toutes les modifications d'un article donné en même temps et, comme les modifications sont appliquées ligne par ligne, le verrouillage et les activités du journal des transactions requis pour l'application des modifications sont minimes.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.

Si vous utilisez des enregistrements logiques, l'Agent de fusion doit traiter les modifications de tout l'enregistrement logique ensemble.If logical records are used, the Merge Agent must process the changes for each entire logical record together. Le temps nécessaire à l'Agent de fusion pour répliquer les lignes est alors plus long.This has an effect on the amount of time it takes the Merge Agent to replicate the rows. En outre, comme l'Agent ouvre une transaction distincte pour chaque enregistrement logique, le verrouillage requis est plus important.Additionally, because the agent opens a separate transaction for each logical record, locking requirements can increase.

Voir aussiSee Also

Options d’articles pour la réplication de fusionArticle Options for Merge Replication