KB4135113 — LABOJUMS: izmaiņu reģistrēšanas ieraksts ir nekonsekvents, atjauninot tabulu, kurai ir sagrupēts vai unikāls indekss pakalpojumā SQL Server

Attiecas uz
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

Pazīmes

Palaižot atjauninājumu tabulai, kurai ir sagrupēts vai unikāls indekss, un atjaunināšana tiek veikta kolonnā, kas nav primārā unikālā kolonna, izmaiņu reģistrēšanas ieraksts ir nesaderīgs ar atjauninājuma priekšrakstu.

Piemēram, pieņemsim, ka kolonna ar nosaukumu "kolonna1" ir iekļauta sagrupētajā vai unikālajā indeksā. Ja kolonnas vērtība tiek mainīta no lielākas uz mazāku vērtību (piemēram, mainot vērtību no 20 uz 16), izmaiņu izsekošanas sānu tabulā pirms dzēšanas operācijas tiek saņemta ievietošanas darbība. Piemēram, transakciju žurnāla rindas ieraksta ievietošanas operācija tiek saņemta pirms rindas dzēšanas operācijas vai "I" tiek ievietots pirms "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

Ja kolonnas vērtība tiek mainīta no mazākas uz lielāku (piemēram, mainot vērtību no 16 uz 20), pirms "I" tiek ievietots "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

Iemesls

Šī problēma rodas nepareizas secības dēļ starp dzēšanas/ievietošanas pāriem izmaiņu izsekošanas sānu tabulā.

Risinājums

Šīs problēmas labojums ir iekļauts šādos SQL Server atjauninājumos:

SQL Server 2017 8. kumulatīvais atjauninājums

9. kumulatīvais atjauninājums SQL Server 2016 1. servisa pakotnei

SQL Server 2014 SP2 12. kumulatīvais atjauninājums

Par SQL Server būvējumiem

Katrā jaunajā SQL Server būvējumā ir visi labojumfaili un drošības labojumi, kas bija iepriekšējā būvējumā. Ieteicams instalēt jaunāko SQL Server būvējumu:

Jaunākais kumulatīvais atjauninājums SQL Server 2017

Jaunākais SQL Server 2016 būvējums

Jaunākais kumulatīvais atjauninājums SQL Server 2014

Statuss

Microsoft apstiprināja, ka šī ir problēma Microsoft produktos, kas norādīti sadaļā "attiecas uz".

Papildinformācija

Izmaiņu reģistrēšanas tabulai, kad atjauninājums notiek neprimārajā kolonnā, kas ir definēta kā unikāla, izmaiņu reģistrēšanas sānu tabulā tiek ievietoti divi ieraksti: viens ieraksts katrai sadalītajai darbībai, Ievietot un Dzēst.

Kad izmaiņu uzskaitīšanai tiek izsaukta funkcija CHANGETABLE , šie ieraksti tiek kārtoti pēc primārās atslēgas vērtībām, un pēc tam operācijas tiek apkopotas. Ja atjauninājums ievieto mazāku vērtību, vispirms sānu tabulā tiek palaista operācija "I", pēc tam darbība "D". Tādējādi šai rindai tiek atgriezta nepareiza darbība. Tas ir tāpēc, ka "I", kam seko "D", tiek apkopots kā "D".

Tā kā sānu tabulās tiek uzturētas tikai primārās atslēgas vērtības, nav nepieciešami divi atsevišķi ieraksti. Tas ir patiess, kamēr primārās atslēgas kolonna nav atjaunināta.

Šī problēma ir novērsta unikālajām kolonnām, kas nav primārās. Šajā gadījumā, veicot atjaunināšanu, tiek ievietota tikai viena rinda ar "U" kā atjaunināšanas darbību, nevis diviem ierakstiem, kuriem ir "D" un "I".

Atsauces

Uzziniet par terminoloģiju , ko Microsoft izmanto, lai aprakstītu programmatūras atjauninājumus.