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.