Problembeschreibung
Wenn Sie eine Aktualisierung für eine Tabelle ausführen, die einen gruppierten oder eindeutigen Index aufweist und die Aktualisierung in einer nicht primären eindeutigen Spalte erfolgt, ist der Änderungsnachverfolgungsdatensatz inkonsistent mit der Update-Anweisung.
Angenommen, eine Spalte mit dem Namen "Spalte1" ist im gruppierten oder eindeutigen Index enthalten. Wenn der Spaltenwert von einem größeren in einen kleineren Wert geändert wird (z. B. ändern Sie den Wert von 20 auf 16), empfängt die Änderungsnachverfolgungs-Seitentabelle den Einfügevorgang vor dem Löschvorgang. Beispielsweise wird der Vorgang zum Einfügen eines Zeileneintrags im Transaktionsprotokoll vor dem Vorgang zum Löschen der Zeile 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. ändern Sie den Wert von 16 auf 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 zur Änderungsnachverfolgung auf.
Lösung
Die Lösung für dieses Problem 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
Informationen zu SQL Server-Builds
Jeder neue Build für SQL Server enthält alle Hotfixes und Sicherheitsfixes, die im vorherigen Build vorhanden waren. Es wird empfohlen, den neuesten Build für SQL Server zu installieren:
Neuestes kumulatives Update für SQL Server 2017
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.
Weitere Informationen
Wenn für eine Tabelle mit aktivierter Änderungsnachverfolgung eine Aktualisierung für eine nicht primäre Spalte erfolgt, die als eindeutig definiert ist, werden zwei Einträge in die Seitentabelle für die Ä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 aufzuführen, werden diese Einträge nach Primärschlüsselwerten sortiert, und dann werden die Vorgänge aggregiert. Wenn die Aktualisierung einen niedrigeren Wert einfügt, wird zuerst ein "I"-Vorgang in der Nebentabelle 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 in den Nebentabellen nur die Primärschlüsselwerte beibehalten werden, sind keine zwei separaten Einträge erforderlich. 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 beim Aktualisieren nur eine Zeile eingefügt, indem "U" als Aktualisierungsvorgang anstelle von zwei Einträgen mit "D" und "I" verwendet wird.
Informationsquellen
Erfahren Sie mehr über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.