Симптоми
Когато изпълните актуализация на таблица, която има клъстериран или уникален индекс и актуализацията възниква в не основен уникална колона, запис за проследяване на промените е несъвместим с командата за актуализиране.
Да предположим например, че колона с име "колона1" е включена в индекса с клъстери или уникален индекс. Когато стойността на колоната се промени от по-голяма на по-малка стойност (например промяната на стойността от 20 на 16), таблицата от страната за проследяване на промените получава операцията за вмъкване преди операцията за изтриване. Например операцията за вмъкване на запис на ред в регистрационния файл на транзакциите се получава преди операцията за изтриване на ред или преди "D" е вмъкнато "I".
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 |
Когато стойността на колоната се промени от по-малка на по-голяма стойност (например промяната на стойността от 16 на 20), преди "I" се вмъква "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 |
I |
NULL |
NULL |
5639485628 |
Причина
Този проблем възниква поради неправилно подреждане между двойки за изтриване/вмъкване в страничната таблица за проследяване на промените.
Решение
Корекцията за този проблем е включена в следните актуализации за SQL Server:
Кумулативна актуализация 8 за SQL Server 2017 г.
Кумулативна актуализация 9 за SQL Server 2016 Service Pack 1
За компилациите за SQL Server
Всяка нова компилация за SQL Server съдържа всички горещи поправки и корекции на защитата, които са били в предишната компилация. Препоръчваме ви да инсталирате най-новата компилация за SQL Server:
Най-нова кумулативна актуализация за SQL Server 2017
Статут
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са изброени в раздела "Отнася се за".
Допълнителна информация
За таблица с разрешено проследяване на промени, когато възникне актуализация в неосновна колона, която е дефинирана като уникална, два записа се вмъкват в страничната таблица за проследяване на промените: един запис за всяко от разделените действия – Вмъкване и Изтриване.
Когато функцията CHANGETABLE се извика за изброяване на промените, тези записи се сортират по стойности на първичния ключ и след това операциите се агрегират. Ако актуализацията вмъква по-ниска стойност, първо се изпълнява операция "I" на страничната таблица, последвана от операция "D". Това води до връщане на неправилна операция за този ред. Това е така, защото "I", последвано от "D", е агрегирано като "D".
Тъй като в страничните таблици се поддържат само стойностите на първичния ключ, не е необходимо да има два отделни записа. Това е вярно, докато колоната за първичен ключ не е актуализирана.
Този проблем е коригиран за неключови уникални колони. В този случай, когато се появи актуализацията, се вмъква само един ред чрез "U" като операция за актуализиране вместо два записа, които имат "D" и "I".
Препратки
Научете повече за терминологията , която Microsoft използва за описване на актуализациите на софтуера.