Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen DatensätzenGroup Changes to Related Rows with Logical Records

GILT FÜR: jaSQL Server neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Hinweis

Dieses Feature befindet sich im Wartungsmodus und wird möglicherweise in einer künftigen Version von Microsoft SQL Server entfernt.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Standardmäßig werden Datenänderungen beim Mergereplikationsprozess auf Zeilenbasis verarbeitet.By default, merge replication processes data changes on a row-by-row basis. In vielen Fällen ist das zweckmäßig, jedoch müssen bei einigen Anwendungen verknüpfte Zeilen als Einheit verarbeitet werden.In many circumstances this is appropriate, but for some applications, it is essential that related rows be processed as a unit. Mit der Funktion logischer Datensätze der Mergereplikation können Sie eine Beziehung zwischen verknüpften Zeilen in verschiedenen Tabellen definieren, sodass Zeilen als Einheit verarbeitet werden.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.

Hinweis

Logische Datensätze können allein oder in Verbindung mit Joinfiltern verwendet werden.The logical records feature can be used alone or in conjunction with join filters. Weitere Informationen zu Joinfiltern finden Sie unter Join Filters.For more information about join filters, see Join Filters. Zum Verwenden logischer Datensätze muss die Veröffentlichung mindestens einen Kompatibilitätsgrad von 90RTM aufweisen.To use logical records, the compatibility level of the publication must be at least 90RTM.

Nehmen Sie die folgenden drei verknüpften Tabellen als Beispiel:Consider these three related tables:

Logischer Datensatz für drei Tabellen für nur SpaltennamenThree table logical record, with column names only

Die Customers -Tabelle ist die übergeordnete Tabelle in dieser Beziehung und enthält eine CustID-Primärschlüsselspalte.The Customers table is the parent table in this relationship and has a primary key column CustID. Die Orders -Tabelle enthält eine OrderID-Primärschlüsselspalte sowie eine FOREIGN KEY-Einschränkung für die CustID -Spalte, die auf die CustID -Spalte in der Customers -Tabelle verweist.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. Dementsprechend enthält die OrderItems -Tabelle eine OrderItemID-Primärschlüsselspalte sowie eine FOREIGN KEY-Einschränkung für die OrderID -Spalte, die auf die OrderID -Spalte in der Orders -Tabelle verweist.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 diesem Beispiel besteht ein logischer Datensatz aus allen Zeilen in der Orders -Tabelle, die sich auf einen einzelnen CustID -Wert beziehen, und allen Zeilen der OrderItems -Tabelle, die sich auf jene Zeilen in der Orders -Tabelle beziehen.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. Das Diagramm zeigt alle Zeilen in den drei Tabellen, die im logischen Datensatz für Customer 2 enthalten sind:This diagram shows all the rows in the three tables that are in the logical record for Customer2:

Logischer Datensatz mit Werten für drei TabellenThree table logical record with values

Informationen zum Definieren einer logischen Datensatzbeziehung zwischen Artikeln finden Sie unter Definieren einer logische Datensatzbeziehung zwischen Mergetabellenartikeln.To define a logical record relationship between articles, see Define a Logical Record Relationship Between Merge Table Articles.

Vorteile logischer DatensätzeBenefits of Logical Records

Logische Datensätze bieten zwei entscheidende Vorteile:The logical records feature has two primary benefits:

  • Datenänderungen werden als Einheit angewendet.Application of data changes as a unit.

  • Gleichzeitige Erkennung und Lösung von Konflikten in mehreren Zeilen aus mehreren Tabellen.The detection and resolution of conflicts simultaneously on multiple rows from multiple tables.

Anwendung von Änderungen als EinheitThe Application of Changes As a Unit

Falls die Mergeverarbeitung unterbrochen wird, wie z. B. bei einer gelöschten Verbindung, wird bei Verwendung logischer Datensätze für die teilweise abgeschlossene Gruppe verknüpfter replizierter Änderungen ein Rollback ausgeführt.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. Beispiel: Ein Abonnent fügt einen neuen Auftrag mit OrderID = 6 und zwei neue Zeilen in der OrderItems -Tabelle mit OrderItemID = 10 und OrderItemID = 11 für OrderID = 6 hinzu.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.

Logischer Datensatz mit Werten für drei TabellenThree table logical record with values

Wenn der Replikationsprozess unterbrochen wird, nachdem die Orders -Zeile für OrderID = 6 abgeschlossen wurde, jedoch bevor die OrderItems 10 und 11 abgeschlossen wurden, ist der OrderTotal -Wert für OrderID = 6 ohne Verwendung logischer Datensätze nicht mit der Summe der OrderAmount -Werte für die OrderItems -Zeilen konsistent.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. Bei Verwendung logischer Datensätze wird für die Orders -Zeile für OrderID = 6 erst dann ein Commit ausgeführt, wenn die verknüpften OrderItems -Änderungen repliziert wurden.If logical records are used, the Orders row for OrderID = 6 is not committed until the related OrderItems changes are replicated.

Ein anderes Szenario bei der Verwendung logischer Datensätze wäre folgendes: Jemand fragt Datensätze ab, während Änderungen vom Mergeprozess angewendet werden. Der Benutzer sieht dann die teilweise replizierten Änderungen erst, wenn sie abgeschlossen sind.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. Beispiel: Die Orders-Zeile für OrderID = 6 wurde vom Replikationsprozess hochgeladen. Jedoch fragt ein Benutzer die Tabellen ab, bevor der Replikationsprozess die OrderItems -Zeilen repliziert hat. Der OrderTotal -Wert wäre nun nicht mit der Summe der OrderAmount -Werte identisch.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. Bei der Verwendung logischer Datensätze wäre die Orders -Zeile erst dann zu sehen, wenn die OrderItems -Zeilen abgeschlossen wurden und ein Commit für die Transaktion als Einheit ausgeführt wurde.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.

Anwendung der Konfliktbehandlung auf mehrere TabellenThe Application of Conflict Handling to More Than One Table

Nehmen Sie als Beispiel den Fall, dass zwei Abonnenten das obige Dataset verwenden:Consider the case where two Subscribers have the data set above:

  • Ein Benutzer ändert auf dem ersten Abonnenten den OrderAmount -Wert von OrderItemID 5 von 100 auf 150 und den OrderTotal -Wert von OrderID 3 von 200 auf 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.

  • Ein Benutzer ändert auf dem zweiten Abonnenten den OrderAmount -Wert von OrderItemID 6 von 25 auf 125 und den OrderTotal -Wert von OrderID 3 von 200 auf 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.

Würden diese Änderungen ohne Verwendung logischer Datensätze repliziert werden, ergäben die unterschiedlichen OrderTotal -Werte einen Konflikt, und nur einer der Werte würde repliziert.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. Die nicht in Konflikt stehenden Änderungen in der OrderItems -Tabelle würden problemlos repliziert. Das würde dazu führen, dass die endgültigen OrderTotal -Werte in Bezug auf die OrderItems -Zeilen inkonsistent wären.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. Werden logische Datensätze in diesem Szenario verwendet, würde auch für die Änderung von OrderItems , die mit der verlierenden Änderung der Orders -Tabelle verbunden ist, ein Rollback ausgeführt. Die endgültigen OrderTotal -Werte entsprächen dann einer genauen Zusammenfassung der OrderItems -Zeilen.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.

Weitere Informationen zur Konflikterkennung und -lösung bei logischen Datensätzen finden Sie unter Ermitteln und Lösen von Konflikten in logischen Datensätzen.For more information about options related to conflict detection and resolution with logical records, see Detecting and Resolving Conflicts in Logical Records.

Überlegungen zum Verwenden logischer DatensätzeConsiderations for Using Logical Records

Beachten Sie bei der Verwendung von logischen Datensätzen Folgendes:Keep the following considerations in mind when using logical records.

Allgemeine ÜberlegungenGeneral Considerations

  • Halten Sie die Anzahl der Tabellen in einem logischen Datensatz so gering wie möglich: Empfohlen werden maximal fünf Tabellen.It is recommended that you keep the number of tables in a logical record as low as possible; five tables or less is recommended.

  • Logische Datensätze können nicht auf Spalten verweisen, die folgende Datentypen enthalten:Logical records cannot reference columns with any of the following data types:

    • varchar(max) und nvarchar(max)varchar(max) and nvarchar(max)

    • varbinary(max)varbinary(max)

    • text und ntexttext and ntext

    • imageimage

    • XMLXML

    • UDTUDT

  • Fremdschlüsselbeziehungen in veröffentlichten Tabellen können nicht mit der Option CASCADE definiert werden.Foreign key relationships in published tables cannot be defined with the CASCADE option. Weitere Informationen finden Sie unter CREATE TABLE (Transact-SQL) und ALTER TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL) and ALTER TABLE (Transact-SQL).

  • Sie können keine Spalten aktualisieren, die in der Klausel der logischen Beziehung verwendet werden.You cannot update any columns that are used in the logical relation clause.

  • Eine benutzerdefinierte Konfliktlösung mit Geschäftslogikhandlern oder benutzerdefinierte Konfliktlöser werden nicht für Artikel unterstützt, die in einen logischen Datensatz eingeschlossen sind.Custom conflict resolution with business logic handlers or custom resolvers is not supported for articles that are included in a logical record.

  • Wenn logische Datensätze in einer Veröffentlichung verwendet werden, die parametrisierte Filter enthält, müssen Sie jeden Abonnenten mit einer Momentaufnahme für dessen Partition initialisieren.If logical records are used in a publication that includes parameterized filters, you must initialize each Subscriber with a snapshot for its partition. Falls Sie einen Abonnenten mit einer anderen Methode initialisieren, schlägt der Merge-Agent fehl.If you initialize a Subscriber with another method, the Merge Agent will fail. Weitere Informationen finden Sie unter Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

  • Konflikte, die logische Datensätze einschließen, werden im Konflikt-Viewer nicht angezeigt.Conflicts that involve logical records are not displayed in Conflict Viewer. Mit den gespeicherten Replikationsprozeduren können Informationen zu diesen Konflikten angezeigt werden.To view information about these conflicts, use replication stored procedures. Weitere Informationen finden Sie unter Anzeigen von Konfliktinformationen zu Mergeveröffentlichungen (Replikationsprogrammierung mit Transact-SQL)For more information, see View Conflict Information for Merge Publications (Replication Transact-SQL Programming).

VeröffentlichungseinstellungenPublication Settings

  • Die Veröffentlichung muss mindestens einen Kompatibilitätsgrad von 90RTM aufweisen.The publication must have a compatibility level of 90RTM or greater. Weitere Informationen finden Sie im Abschnitt „Kompatibilitätsgrad von Veröffentlichungen“ Abwärtskompatibilität von Replikationen.For more information, see the "Publication Compatibility Level" section of Replication Backward Compatibility.

  • Die Veröffentlichung muss den systemeigenen Momentaufnahmemodus verwenden.The publication must use native snapshot mode. Dies ist die Standardeinstellung, es sei denn, Sie replizieren in SQL Server CompactSQL Server Compact. Logische Datensätze werden von diesem Programm nicht unterstützt.This is the default unless you are replicating to SQL Server CompactSQL Server Compact, which does not support logical records.

  • Die Veröffentlichung kann eine Websynchronisierung nicht zulassen.The publication cannot allow Web synchronization. Weitere Informationen zur Websynchronisierung finden Sie unter Web Synchronization for Merge Replication.For more information about Web synchronization, see Web Synchronization for Merge Replication.

  • Gehen Sie folgendermaßen vor, wenn Sie logische Datensätze für eine gefilterte Veröffentlichung verwenden möchten:In order to use logical records on a filtered publication:

  • Wenn die Veröffentlichung Joinfilter verwendet, muss die join unique key -Eigenschaft für alle Joinfilter, die an Beziehungen logischer Datensätze beteiligt sind, auf true festgelegt werden.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. Weitere Informationen finden Sie unter Join Filters.For more information, see Join Filters.

Beziehungen zwischen TabellenRelationships Between Tables

  • Tabellen, die über logische Datensätze verknüpft sind, müssen Primärschlüssel/Fremdschlüssel-Beziehungen aufweisen.Tables related through logical records must have a primary key-foreign key relationship.

  • Die Option NOT FOR REPLICATION kann für FOREIGN KEY-Einschränkungen nicht festgelegt werden.The NOT FOR REPLICATION option cannot be set for foreign key constraints.

  • Untergeordnete Tabellen können nur eine übergeordnete Tabelle aufweisen.Child tables can have only one parent table.

    Eine Datenbank, in der z. B. Kurse und Studenten nachverfolgt werden, könnte folgendermaßen aufgebaut sein:For example, a database tracking classes and students might have a design similar to:

    Untergeordnete Tabelle mit mehr als einer übergeordneten TabelleChild table with more than one parent table

    Sie können keinen logischen Datensatz verwenden, der die drei Tabellen in dieser Beziehung darstellt, da die Zeilen in ClassMembers keiner einzelnen Primärschlüsselzeile zugewiesen sind.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. Die Tabellen Classes und ClassMembers könnten jedoch einen logischen Datensatz bilden, ebenso die Tabellen ClassMembers und Students, aber nicht alle drei zusammen.The tables Classes and ClassMembers could still form a logical record, as could the tables ClassMembers and Students, but not all three.

  • Die Veröffentlichung kann keine kreisförmigen Joinfilterbeziehungen enthalten.The publication cannot contain circular join filter relationships.

    Nehmen Sie das Beispiel Customers, Ordersund OrderItems: Sie könnten keine logischen Datensätze verwenden, wenn die Orders -Tabelle auch eine FOREIGN KEY-Einschränkung aufweisen würde, die auf die OrderItems -Tabelle verweist.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.

Leistungseinschränkungen logischer DatensätzePerformance implications of logical records

Logische Datensätze wirken sich auf die Leistung aus.The logical record feature does come with a performance cost. Ohne logische Datensätze kann der Replikations-Agent alle Änderungen für einen bestimmten Artikel gleichzeitig verarbeiten. Da die Änderungen zeilenweise erfolgen, bestehen außerdem nur minimale Sperr- und Transaktionsprotokollanforderungen für die Anwendung von Änderungen.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.

Werden logische Datensätzen verwendet, muss der Merge-Agent die Änderungen für jeden vollständigen logischen Datensatz auf einmal verarbeiten.If logical records are used, the Merge Agent must process the changes for each entire logical record together. Das wirkt sich auf die Dauer aus, die der Merge-Agent zum Replizieren der Zeilen benötigt.This has an effect on the amount of time it takes the Merge Agent to replicate the rows. Darüber hinaus können sich die Sperranforderungen erhöhen, da der Agent eine separate Transaktion für jeden logischen Datensatz öffnet.Additionally, because the agent opens a separate transaction for each logical record, locking requirements can increase.

Weitere InformationenSee Also

Artikeloptionen für die MergereplikationArticle Options for Merge Replication