KB4135113 - REMEDIERE: Înregistrarea de urmărire a modificărilor este inconsistentă în timpul unei actualizări pe un tabel care are un index unic sau în clustere în SQL Server

Se aplică la
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

Simptome

Atunci când rulați o actualizare într-un tabel care are un index clusterizat sau unic și actualizarea are loc într-o coloană unică non-principală, înregistrarea urmăririi modificărilor nu este consistentă cu instrucțiunea update.

De exemplu, să presupunem că o coloană numită "coloana1" este inclusă în indexul grupat sau unic. Atunci când valoarea coloanei se modifică dintr-o valoare mai mare într-una mai mică (cum ar fi schimbarea valorii de la 20 la 16), tabelul lateral urmărire a modificărilor primește operațiunea de inserare înainte de operațiunea de ștergere. De exemplu, operațiunea de inserare a înregistrării rândurilor în jurnalul de tranzacții este primită înainte de operațiunea de ștergere a rândurilor sau este inserat "I" înainte de "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

Când valoarea coloanei este modificată dintr-o valoare mai mică într-una mai mare (cum ar fi schimbarea valorii de la 16 la 20), se inserează "D" înainte de "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

Cauză

Această problemă apare din cauza unei ordonări incorecte între perechile de ștergere/inserare din tabelul lateral de urmărire a modificărilor.

Rezolvare

Remedierea pentru această problemă este inclusă în următoarele actualizări pentru SQL Server:

Actualizarea cumulativă 8 pentru SQL Server 2017

Actualizarea cumulativă 9 pentru SQL Server 2016 Service Pack 1

Actualizarea cumulativă 12 pentru SQL Server 2014 SP2

Despre compilările SQL Server

Fiecare versiune nouă pentru SQL Server conține toate remedierile rapide și remedierile de securitate din compilarea anterioară. Vă recomandăm să instalați cea mai recentă versiune pentru SQL Server:

Cea mai recentă actualizare cumulativă pentru SQL Server 2017

cea mai recentă compilare pentru SQL Server 2016

Cea mai recentă actualizare cumulativă pentru SQL Server 2014

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.

Mai multe informații

Pentru un tabel cu urmărirea modificărilor activată, atunci când are loc o actualizare într-o coloană non-principală care este definită ca unică, două intrări sunt inserate în tabelul lateral urmărire modificări: O intrare pentru fiecare dintre acțiunile scindate, Inserare și Ștergere.

Când este apelată funcția CHANGETABLE pentru a enumera modificările, aceste intrări sunt sortate după valorile cheii primare, iar operațiunile sunt agregate. Dacă actualizarea inserează o valoare mai mică, mai întâi va rula o operațiune "I" în tabelul lateral, urmată de o operațiune "D". Acest lucru provoacă returnarea unei operațiuni incorecte pentru acest rând. Acest lucru se întâmplă deoarece "I" după "D" este agregat ca "D".

Deoarece numai valorile cheii primare se păstrează în tabelele laterale, nu este necesar să aveți două intrări separate. Acest lucru este valabil atât timp cât nu se actualizează coloana cheii primare.

Această problemă este remediată pentru coloanele unice non-principale. În acest caz, atunci când are loc actualizarea, se inserează un singur rând având "U" ca operațiune de actualizare, în loc de două intrări care au "D" și "I".

Referințe

Aflați despre terminologia pe care o utilizează Microsoft pentru a descrie actualizările de software.