Sintomi
Quando si esegue un aggiornamento su una tabella che contiene un indice cluster o univoco e l'aggiornamento si verifica in una colonna univoca non primaria, il record di rilevamento delle modifiche non è coerente con l'istruzione update.
Si supponga ad esempio che una colonna denominata "column1" sia inclusa nell'indice cluster o univoco. Quando il valore della colonna viene modificato da un valore più grande a un valore inferiore, ad esempio modificando il valore da 20 a 16, la tabella laterale di rilevamento delle modifiche riceve l'operazione di inserimento prima dell'operazione di eliminazione. Ad esempio, l'operazione di inserimento record di riga del log delle transazioni viene ricevuta prima dell'operazione di eliminazione della riga o la "I" viene inserita prima di "D".
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1116 |
19 |
Ho |
NULL |
NULL |
5639485628 |
1116 |
20 |
D |
NULL |
NULL |
5639485628 |
Quando il valore della colonna viene modificato da un valore più piccolo a un valore più grande (ad esempio cambiando il valore da 16 a 20), prima di "I" viene inserito "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 |
Ho |
NULL |
NULL |
5639485628 |
Causa
Questo problema si verifica a causa di un ordinamento errato tra le coppie di eliminazione/inserimento nella tabella laterale di rilevamento delle modifiche.
Risoluzione
La correzione di questo problema è inclusa negli aggiornamenti seguenti per SQL Server:
Aggiornamento cumulativo 8 per SQL Server 2017
Aggiornamento cumulativo 9 per SQL Server 2016 Service Pack 1
Informazioni sulle build SQL Server
Ogni nuova build per SQL Server contiene tutti gli aggiornamenti rapidi e le correzioni per la sicurezza inclusi nella build precedente. È consigliabile installare la build più recente per SQL Server:
Ultimo aggiornamento cumulativo per SQL Server 2017
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".
Ulteriori informazioni
Per una tabella abilitata per il rilevamento delle modifiche, quando si verifica un aggiornamento in una colonna non primaria definita univoca, nella tabella laterale di rilevamento delle modifiche vengono inserite due voci: una per ogni azione di divisione, Inserisci ed Elimina.
Quando si chiama la funzione CHANGETABLE per enumerare le modifiche, queste voci vengono ordinate in base ai valori di chiave primaria e quindi le operazioni vengono aggregate. Se l'aggiornamento inserisce un valore inferiore, viene prima eseguita un'operazione "I" sulla tabella laterale, seguita da un'operazione "D". In questo modo viene restituita un'operazione non corretta per questa riga. Il motivo è che "I" seguito da "D" viene aggregato come "D".
Poiché solo i valori di chiave primaria vengono mantenuti nelle tabelle laterali, non è necessario avere due voci separate. Ciò vale a condizione che la colonna di chiave primaria non venga aggiornata.
Questo problema è stato risolto per le colonne univoche non primarie. In questo caso, quando si verifica l'aggiornamento, viene inserita una sola riga includendo "U" come operazione di aggiornamento invece di due voci con "D" e "I".
Riferimenti
Informazioni sulla terminologia utilizzata da Microsoft per descrivere gli aggiornamenti software.