Symptomer
Når du kører en opdatering på en tabel, der har et grupperet eller entydigt indeks, og opdateringen forekommer på en ikke-primær entydig kolonne, er registreringsposten for ændringer i strid 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. ændring af værdien fra 20 til 16), modtager tabellen til registrering af ændringer indsætningshandlingen før sletningen. Transaktionsloggen indsætter f.eks. rækkeposthandlingen, før handlingen slet række indsættes, 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. ændring af 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 tabellen til registrering af ændringer.
Løsning
Løsningen på dette problem er inkluderet i følgende opdateringer til SQL Server:
Samlet opdatering 8 til SQL Server 2017
Samlet opdatering 9 til SQL Server 2016 Service Pack 1
Om SQL Server-builds
Hvert nye build til SQL Server indeholder alle de hotfixes og sikkerhedsrettelser, der var i det tidligere build. Vi anbefaler, at du installerer det nyeste build til SQL Server:
Seneste akkumulerede opdatering til SQL Server 2017
Status
Microsoft har bekræftet, at problemet findes i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".
Flere oplysninger
Når en tabel til registrering af ændringer er aktiveret, indsættes der to poster i tabellen til registrering af ændringer, når der forekommer en opdatering på en ikke-primær kolonne, der er defineret som entydig, i tabellen til registrering af ændringer: En post for hver af de opdelte handlinger, Indsæt og Slet.
Når funktionen SKIFTTABEL 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 en "I"-handling på sidetabellen først efterfulgt af en "D"-handling. Dette medfører, at der returneres en forkert handling for denne række. Dette skyldes, at "I" efterfulgt "D" sammenlægges som "D".
Da det kun er værdierne for den primære nøgle, der 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 ikke-primære entydige kolonner. I dette tilfælde, når opdateringen forekommer, indsættes der kun én række ved at have "U" som en opdateringshandling i stedet for to poster, der har "D" og "I".
Referencer
Få mere at vide om den terminologi , som Microsoft bruger til at beskrive softwareopdateringer.