Symptomen
Wanneer u een update uitvoert voor een tabel met een geclusterde of unieke index en de update plaatsvindt in een niet-primaire unieke kolom, is de record voor het bijhouden van wijzigingen inconsistent met de update-instructie.
Stel dat een kolom met de naam kolom1 is opgenomen in de geclusterde of unieke index. Wanneer de kolomwaarde wordt gewijzigd van een grotere in een kleinere waarde (zoals het wijzigen van de waarde van 20 in 16), ontvangt de zijtabel voor het bijhouden van wijzigingen de invoegbewerking voordat de verwijderbewerking wordt uitgevoerd. De bewerking rijrecord invoegen in het transactielogboek wordt bijvoorbeeld ontvangen voordat de bewerking rij verwijderen of 'I' wordt ingevoegd vóór 'D'.
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 |
Wanneer de kolomwaarde wordt gewijzigd van een kleinere in een grotere waarde (zoals het wijzigen van de waarde van 16 in 20), wordt 'D' ingevoegd vóór 'I'.
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 |
Oorzaak
Dit probleem treedt op vanwege een onjuiste volgorde tussen verwijder-/invoegparen in de bijzettabel voor het bijhouden van wijzigingen.
Oplossing
De oplossing voor dit probleem is opgenomen in de volgende updates voor SQL Server:
Cumulatieve update 8 voor SQL Server 2017
Cumulatieve update 9 voor SQL Server 2016 Service Pack 1
Over SQL Server builds
Elke nieuwe build voor SQL Server bevat alle hotfixes en beveiligingscorrecties die in de vorige build waren. U wordt aangeraden de nieuwste build voor SQL Server te installeren:
Meest recente cumulatieve update voor SQL Server 2017
Status
Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.
Meer informatie
Als voor een tabel met wijzigingen bijhouden een update wordt uitgevoerd op een niet-primaire kolom die uniek is gedefinieerd, worden er twee vermeldingen ingevoegd in de zijtabel voor het bijhouden van wijzigingen: één vermelding voor elk van de gesplitste acties, Invoegen en Verwijderen.
Wanneer de functie CHANGETABLE wordt aangeroepen om de wijzigingen op te sommen, worden deze vermeldingen gesorteerd op primaire sleutelwaarden en worden de bewerkingen vervolgens geaggregeerd. Als de update een lagere waarde invoegt, wordt eerst een 'I'-bewerking uitgevoerd op de zijtabel, gevolgd door een 'D'-bewerking. Hierdoor wordt een onjuiste bewerking geretourneerd voor deze rij. Dit komt omdat 'I' gevolgd door 'D' is geaggregeerd als 'D'.
Omdat alleen de primaire-sleutelwaarden in de bijtabellen worden bijgehouden, hoeft u geen twee afzonderlijke vermeldingen te hebben. Dit geldt zolang de primaire sleutelkolom niet wordt bijgewerkt.
Dit probleem is opgelost voor niet-primaire unieke kolommen. In dit geval wordt, wanneer de update plaatsvindt, slechts één rij ingevoegd door 'U' als updatebewerking te hebben in plaats van twee vermeldingen met 'D' en 'I'.
Verwijzingen
Meer informatie over de terminologie die Microsoft gebruikt om software-updates te beschrijven.