KB4135113 – KORREKTUR: Änderungsnachverfolgungsdatensatz ist während einer Aktualisierung einer Tabelle mit einem gruppierten oder eindeutigen Index in SQL Server

Gilt für
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows

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.