KB4135113 – RETTELSE: Ændringssporingspost er inkonsekvent under en opdatering i en tabel, der har et grupperet eller entydigt indeks i SQL Server

Gælder for
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

Symptomer

Når du kører en opdatering på en tabel, der har et grupperet eller entydigt indeks, og opdateringen sker på en ikke-primær entydig kolonne, er ændringssporingsposten ikke i overensstemmelse med opdateringssætningen.

Antag f.eks., at en kolonne med navnet "kolonne1" er inkluderet i det grupperede eller entydige indeks. Når kolonneværdien ændres fra en større til en mindre værdi (f.eks ændrer værdien fra 20 til 16), modtager sidetabellen med registrering af ændringer handlingen indsættelseshandlingen før slettehandlingen. F.eks. modtages posthandlingen for indsættelse af række i transaktionsloggen før handlingen slet række, eller "I" indsættes fø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

Når kolonneværdien ændres fra en mindre til en større værdi (f.eks ændrer værdien fra 16 til 20), indsættes "D" fø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

Årsag

Dette problem opstår på grund af forkert rækkefølge mellem slet/indsæt par i sidetabellen med ændringsregistrering.

Løsning

Løsningen på dette problem er inkluderet i følgende opdateringer til SQL Server:

Akkumuleret opdatering 8 til SQL Server 2017

Kumulativ opdatering 9 til SQL Server 2016 Service Pack 1

Kumulativ opdatering 12 til SQL Server 2014 SP2

Om SQL Server-builds

Hvert nyt build til SQL Server indeholder alle de programrettelser og sikkerhedsrettelser, der var i det tidligere build. Vi anbefaler, at du installerer det nyeste build til SQL Server:

Seneste kumulative opdatering til SQL Server 2017

seneste build til SQL Server 2016

Seneste kumulative opdatering til SQL Server 2014

Status

Microsoft har bekræftet, at dette er et problem i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".

Flere oplysninger

For en tabel med aktiveret ændringsregistrering, når der sker en opdatering i en ikke-primær kolonne, der er defineret til at være entydig, indsættes to poster i sidetabellen med ændringsregistrering: Én post for hver af de opdelte handlinger, Indsæt og Slet.

Når funktionen CHANGETABLE kaldes for at optælle ændringerne, sorteres disse poster efter primære nøgleværdier, og derefter sammenlægges handlingerne. Hvis opdateringen indsætter en lavere værdi, køres der først en "I"-handling på sidetabellen efterfulgt af en "D"-handling. Dette medfører, at der returneres en forkert handling for denne række. Dette skyldes, at "I" fulgte "D" sammenlægges som "D".

Da kun værdierne i den primære nøgle bevares i sidetabellerne, er det ikke nødvendigt at have to separate poster. Dette gælder, så længe kolonnen med den primære nøgle ikke opdateres.

Dette problem er rettet for entydige kolonner, der ikke er primære. I dette tilfælde, når opdateringen sker, indsættes kun én række ved at have "U" som opdateringshandling i stedet for to poster, der har "D" og "I".

Referencer

Læs mere om den terminologi , Microsoft bruger til at beskrive softwareopdateringer.