KB4135113 – PATAISA: keitimų sekimo įrašas yra nenuoseklus, kai naujinama lentelė, kurioje yra klasterinis arba unikalus indeksas „SQL Server“

Taikoma
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

Požymiai

Kai paleidžiate naujinimą lentelėje, kurioje yra jungtinis arba unikalus indeksas, o naujinimas vyksta ne pirminiame unikaliame stulpelyje, keitimų sekimo įrašas yra nesuderinamas su sakiniu Atnaujinti.

Pavyzdžiui, tarkime, kad stulpelis, pavadintas "1stulpelis", yra įtrauktas į jungtinį arba unikalų indeksą. Kai stulpelio reikšmė pakeičiama iš didesnės į mažesnę (pvz., pakeičiama iš 20 į 16), keitimų sekimo šoninė lentelė gauna įterpimo operaciją prieš naikinimo operaciją. Pvz., operacijų žurnalo eilutės įterpimo operacija gaunama prieš eilutės naikinimo operaciją arba prieš "D" įterpiama "I".

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

Kai stulpelio reikšmė pakeičiama iš mažesnės į didesnę (pvz., pakeičiama reikšmė iš 16 į 20), prieš "I" įterpiama "D".

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

Priežastis

Ši problema kyla dėl neteisingos naikinimo / įterpimo porų tvarkos keitimų sekimo šoninėje lentelėje.

Sprendimas

Šios problemos sprendimas įtrauktas į šiuos "„SQL Server“" naujinimus:

8 kaupiamasis naujinimas, skirtas „SQL Server“ 2017

9 kaupiamasis naujinimas, skirtas "„SQL Server“ 2016" 1 pakeitimų paketui

12 kaupiamasis naujinimas, skirtas „SQL Server“ 2014 SP2

Apie "„SQL Server“" komponavimo versijas

Kiekvienoje naujoje "„SQL Server“" versijoje yra visos karštosios pataisos ir saugos pataisos, kurios buvo ankstesnėje komponavimo versijoje. Rekomenduojame įdiegti naujausią "„SQL Server“" komponavimo versiją:

Naujausias "„SQL Server“ 2017" kaupiamasis naujinimas

naujausia "„SQL Server“ 2016" versija

Naujausias "„SQL Server“ 2014" kaupiamasis naujinimas

Būsena

„„Microsoft““ patvirtino, kad tai yra „„Microsoft““ produktų, išvardytų dalyje „Taikoma“, problema.

Daugiau informacijos

Kai keitimų sekimą įgalinančios lentelės naujinimas atliekamas ne pirminiame stulpelyje, kuris apibrėžtas kaip unikalus, į keitimų sekimo šoninę lentelę įterpiami du įrašai: Po vieną įrašą kiekvienam perskirtajam veiksmui – Įterpti ir Naikinti.

Kai funkcija CHANGETABLE iškviečiama keitimams išvardyti, šie įrašai rikiuojami pagal pirminio rakto reikšmes, tada operacijos agreguojamos. Jei naujinimas įterpia mažesnę reikšmę, pirma šoniniame staliuke paleidžiama operacija I, po to operacija D. Dėl to šiai eilutei pateikiama neteisinga operacija. Taip yra todėl, kad "I" ir "D" agreguojamas kaip "D".

Šoninėse lentelėse išlaikomos tik pirminio rakto reikšmės, todėl nebūtina turėti dviejų atskirų įrašų. Tai galioja tol, kol neatnaujinamas pirminio rakto stulpelis.

Ši problema išspręsta ne pirminiuose unikaliuose stulpeliuose. Šiuo atveju, kai vyksta naujinimas, įterpiama tik viena eilutė naudojant "U" kaip naujinimo operaciją vietoj dviejų įrašų, kuriuose yra "D" ir "I".

Nuorodos

Sužinokite daugiau apie terminus , kuriuos "„Microsoft“" naudoja apibūdindama programinės įrangos naujinimus.