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.