Symptome
Wenn Sie ein Update für eine Tabelle mit einem gruppierten oder eindeutigen Index ausführen und das Update für eine nicht primäre eindeutige Spalte erfolgt, ist der Änderungsnachverfolgungsdatensatz mit der update-Anweisung inkonsistent.
Angenommen, eine Spalte mit dem Namen "Column1" ist im gruppierten oder eindeutigen Index enthalten. Wenn der Spaltenwert von einem größeren in einen kleineren Wert geändert wird (z. B. das Ändern des Werts von 20 in 16), empfängt die Änderungsnachverfolgungs-Seitentabelle den Einfügevorgang vor dem Löschvorgang. Beispielsweise wird der Vorgang zum Einfügen eines Zeilendatensatzes im Transaktionsprotokoll vor dem Vorgang zum Löschen von Zeilen empfangen, oder "I" wird vor "D" eingefügt.
| Sys_change_version | sys_change_create_version | sys_change_operation | sys_change_column | sys_change_context | PK_column |
|---|---|---|---|---|---|
| 1116 | 19 | I | NULL | NULL | 5639485628 |
| 1116 | 20 | D | NULL | NULL | 5639485628 |
Wenn der Spaltenwert von einem kleineren in einen größeren Wert geändert wird (z. B. das Ändern des Werts von 16 in 20), wird "D" vor "I" eingefügt.
| Sys_change_version | sys_change_create_version | sys_change_operation | sys_change_column | sys_change_context | PK_column |
|---|---|---|---|---|---|
| 1126 | 32 | D | NULL | NULL | 5639485628 |
| 1126 | 33 | I | NULL | NULL | 5639485628 |
Ursache
Dieses Problem tritt aufgrund einer falschen Reihenfolge zwischen Lösch-/Einfügepaaren in der Seitentabelle der Änderungsnachverfolgung auf.
Lösung
Die Behebung dieses Problems ist in den folgenden Updates für SQL Server enthalten:
Kumulatives Update 8 für SQL Server 2017
Kumulatives Update 9 für SQL Server 2016 Service Pack 1
Kumulatives Update 12 für SQL Server 2014 SP2
Informationen zu SQL Server Builds
Jeder neue Build für SQL Server enthält alle Hotfixes und Sicherheitsfixes aus dem vorherigen Build. Es wird empfohlen, den neuesten Build für SQL Server zu installieren:
Neuestes kumulative Update für SQL Server 2017
Neuester Build für SQL Server 2016
Neuestes kumulatives Update für SQL Server 2014
Status
Microsoft hat bestätigt, dass dies ein Problem bei den Microsoft-Produkten ist, die im Abschnitt „Gilt für“ aufgeführt sind.
Weitere Informationen
Wenn für eine Tabelle mit aktivierter Änderungsnachverfolgung ein Update für eine nicht primäre Spalte erfolgt, die als eindeutig definiert ist, werden zwei Einträge in die Seitentabelle der Änderungsnachverfolgung eingefügt: Ein Eintrag für jede der geteilten Aktionen, Einfügen und Löschen.
Wenn die CHANGETABLE-Funktion aufgerufen wird, um die Änderungen aufzulisten, werden diese Einträge nach Primärschlüsselwerten sortiert, und dann werden die Vorgänge aggregiert. Wenn das Update einen niedrigeren Wert einfügt, wird zuerst ein "I"-Vorgang für die Seitentabelle ausgeführt, gefolgt von einem "D"-Vorgang. Dies führt dazu, dass für diese Zeile ein falscher Vorgang zurückgegeben wird. Dies liegt daran, dass "I" gefolgt von "D" als "D" aggregiert wird.
Da nur die Primärschlüsselwerte in den Seitentabellen beibehalten werden, ist es nicht erforderlich, zwei separate Einträge zu haben. Dies gilt, solange die Primärschlüsselspalte nicht aktualisiert wird.
Dieses Problem wurde für nicht primäre eindeutige Spalten behoben. In diesem Fall wird bei der Aktualisierung nur eine Zeile eingefügt, indem "U" als Aktualisierungsvorgang anstelle von zwei Einträgen mit "D" und "I" verwendet wird.
Referenzmaterial
Erfahren Sie mehr über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.