Simptomi
Kada pokrenete ažuriranje na tablici koja ima grupirani ili jedinstveni indeks, a ažuriranje se odvija u ne-primarnom jedinstvenom stupcu, zapis evidentiranja promjena nije usklađen s izjavom ažuriranja.
Pretpostavimo, primjerice, da je stupac naziva "stupac1" uvršten u grupirani ili jedinstveni indeks. Kada se vrijednost stupca promijeni iz veće u manju vrijednost (kao što je promjena vrijednosti iz 20 u 16), bočna tablica evidentiranja promjena primit će operaciju umetanja prije operacije brisanja. Operacija umetanja zapisa retka zapisnika transakcija, primjerice, prima se prije operacije brisanja retka ili "I" prije "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 |
Kada se vrijednost stupca promijeni iz manje u veću vrijednost (kao što je promjena vrijednosti iz 16 u 20), "D" umeće se prije "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 |
Uzrok
Taj se problem pojavljuje zbog neispravnog redoslijeda između parova brisanja/umetanja u bočnoj tablici evidentiranja promjena.
Rješenje
Rješenje tog problema obuhvaćeno je sljedećim ažuriranjima za SQL Server:
Kumulativno ažuriranje 8 za SQL Server 2017.
Kumulativno ažuriranje 9 za SQL Server 2016 Service Pack 1
O SQL Server međuverzijama
Svaka nova međuverzija za SQL Server sadrži sve hitne popravke i sigurnosne popravke koji su se nalazili u prethodnoj međuverziji. Preporučujemo da instalirate najnoviju međuverziju za SQL Server:
Najnovije kumulativno ažuriranje za SQL Server 2017.
Status
Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku "Odnosi se na".
Dodatne informacije
Kada je u tablici omogućeno evidentiranje promjena, kada se ažuriranje dogodi u stupcu koji nije primarni, a koji je definiran kao jedinstven, u bočnu tablicu evidentiranja promjena umetnu se dva unosa: jedan unos za svaku od podijeljenih akcija, Umetanje i Brisanje.
Kada se funkcija CHANGETABLE poziva da enumerira promjene, ti se unosi sortiraju prema vrijednostima primarnog ključa, a zatim se operacije zbrajaju. Ako ažuriranje umetne nižu vrijednost, najprije se na bočnoj tablici izvodi operacija "I", a zatim operacija "D". Zbog toga se za ovaj redak vraća pogrešna operacija. To je zato što se "I" nakon "D" zbraja kao "D".
Budući da se u bočnim tablicama održavaju samo vrijednosti primarnog ključa, nije potrebno imati dva zasebna unosa. To vrijedi sve dok se stupac primarnog ključa ne ažurira.
Taj je problem riješen za ne-primarne jedinstvene stupce. U tom slučaju, kada se ažuriranje dogodi, samo se jedan redak umeće tako da kao operaciju ažuriranja umjesto dva unosa koja imaju "D" i "I" umetnete "U".
Reference
Saznajte više o terminologiji koju Microsoft koristi za opisivanje softverskih ažuriranja.