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.