Simptome
Atunci când rulați o actualizare într-un tabel care are un index unic sau grupat și actualizarea are loc într-o coloană unică non-primară, înregistrarea de urmărire a modificărilor nu este consistentă cu instrucțiunea de actualizare.
De exemplu, să presupunem că o coloană denumită "coloana1" este inclusă în indexul unic sau grupat. Atunci când valoarea coloanei este modificată de la o valoare mai mare la o valoare mai mică (cum ar fi modificarea valorii de la 20 la 16), tabelul lateral de 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ândului din jurnalul de tranzacții este primită înainte de operațiunea de ștergere a rândului sau de inserarea "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 |
Atunci când valoarea coloanei este modificată de la o valoare mai mică la o valoare mai mare (cum ar fi modificarea 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 ordini 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
Despre versiunile SQL Server
Fiecare versiune nouă pentru SQL Server conține toate remedierile rapide și remedierile de securitate care au fost în versiunea 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ă versiune 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 enumerate în secțiunea „Se aplică la”.
Mai multe informații
Pentru un tabel activat pentru urmărirea modificărilor, atunci când are loc o actualizare într-o coloană non-principală definită a fi unică, sunt inserate două intrări în tabelul lateral de urmărire a modificărilor: o intrare pentru fiecare dintre acțiunile de scindare, Inserare și Ștergere.
Atunci când funcția CHANGETABLE este apelată pentru enumerarea modificărilor, aceste intrări sunt sortate după valorile cheii primare, apoi operațiunile sunt agregate. Dacă actualizarea inserează o valoare mai mică, se execută mai întâi o operațiune "I" în tabelul lateral, urmată de o operațiune "D". Acest lucru provoacă o operațiune incorectă returnată pentru acest rând. Acest lucru se întâmplă deoarece "I" urmat "D" este agregat ca "D".
Deoarece numai valorile cheii primare sunt menținute în tabelele laterale, nu este necesar să aveți două intrări separate. Acest lucru este valabil atât timp cât coloana cheii primare nu se actualizează.
Această problemă este remediată pentru coloanele unice non-primare. Î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.