KB4135113 – LØSNING: Endringssporingsposten er inkonsekvent under en oppdatering i en tabell som har en gruppert eller unik indeks i SQL Server

Gjelder 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 kjører en oppdatering på en tabell som har en gruppert eller unik indeks, og oppdateringen skjer på en ikke-primær unik kolonne, er endringssporingsposten inkonsekvent med oppdateringssetningen.

Anta for eksempel at en kolonne med navnet «kolonne1» er inkludert i den grupperte eller unike indeksen. Når kolonneverdien endres fra en større til en lavere verdi (for eksempel fra 20 til 16), mottar sidetabellen for endringssporing innsettingsoperasjonen før sletteoperasjonen. For eksempel er operasjonen for å sette inn rad i transaksjonsloggen mottatt før sletteoperasjonen for rad, eller «I» settes inn 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 kolonneverdien endres fra en mindre til en høyere verdi (for eksempel ved å endre verdien fra 16 til 20), settes D inn 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

Årsak

Dette problemet oppstår på grunn av feil rekkefølge mellom slette- og innsettingspar i tabellen for endringssporing.

Oppløsning

Løsningen på dette problemet er inkludert i følgende oppdateringer for SQL Server:

Kumulativ oppdatering 8 for SQL Server 2017

Kumulativ oppdatering 9 for SQL Server 2016 Service Pack 1

Kumulativ oppdatering 12 for SQL Server 2014 SP2

Om SQL Server-bygg

Hvert nye bygg for SQL Server inneholder alle hurtigreparasjoner og sikkerhetsoppdateringer som fantes i forrige bygg. Vi anbefaler at du installerer det nyeste bygget for SQL Server:

Den nyeste kumulative oppdateringen for SQL Server 2017

nyeste build for SQL Server 2016

Den nyeste kumulative oppdateringen for SQL Server 2014

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen «Gjelder for».

Mer informasjon

Når det forekommer en oppdatering på en ikke-primær kolonne som er definert som unik, for en tabell med aktivering av endringssporing, blir to oppføringer satt inn i sidetabellen for endringssporing: Én oppføring for hver av delingshandlingene, Sett inn og Slett.

Når CHANGETABLE-funksjonen kalles opp for å liste opp endringene, sorteres disse oppføringene etter primærnøkkelverdier, og deretter aggregeres operasjonene. Hvis oppdateringen setter inn en lavere verdi, kjøres en I-operasjon på sidetabellen først, etterfulgt av en D-operasjon. Dette gjør at en feil operasjon returneres for denne raden. Dette er fordi «I» etterfulgt av «D» aggregeres som «D».

Siden bare primærnøkkelverdiene vedlikeholdes i sidetabellene, er det ikke nødvendig å ha to separate oppføringer. Dette gjelder så lenge primærnøkkelkolonnen ikke er oppdatert.

Dette problemet er løst for ikke-primære unike kolonner. I dette tilfellet, når oppdateringen skjer, blir bare én rad satt inn ved å ha «U» som en oppdateringsoperasjon i stedet for to oppføringer som har «D» og «I».

Kilder

Finn ut mer om terminologien Microsoft bruker til å beskrive programvareoppdateringer.