Příznaky
Když spustíte aktualizaci v tabulce, která má clusterovaný nebo jedinečný index a k aktualizaci dojde v neprimárním jedinečném sloupci, záznam sledování změn je nekonzistentní s příkazem update.
Předpokládejme například, že sloupec s názvem "sloupec1" je součástí clusterovaného nebo jedinečného indexu. Když se hodnota sloupce změní z větší na menší hodnotu (například změna hodnoty z 20 na 16), tabulka na straně sledování změn obdrží operaci vložení před operací odstranění. Například operace záznamu řádku vložení transakčního protokolu je přijata před operaci odstranění řádku, nebo "I" je vložen před "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 |
Při změně hodnoty sloupce z menší na větší hodnotu (například změna hodnoty z 16 na 20) se před "I" vloží "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 |
Příčina
K tomuto problému dochází z důvodu nesprávné řazení mezi páry delete/insert v tabulce na straně sledování změn.
Řešení
Oprava tohoto problému je součástí následujících aktualizací pro SQL Server:
Kumulativní aktualizace 8 pro SQL Server 2017
Kumulativní aktualizace 9 pro SQL Server 2016 Service Pack 1
Informace o sestaveních SQL Server
Každé nové sestavení pro SQL Server obsahuje všechny opravy hotfix a opravy zabezpečení, které byly v předchozím buildu. Doporučujeme nainstalovat nejnovější build pro SQL Server:
Nejnovější kumulativní aktualizace pro SQL Server 2017
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.
Více informací
V případě tabulky s povoleným sledováním změn se při aktualizaci neprimárního sloupce, který je definován jako jedinečný, vloží do tabulky na straně sledování změn dvě položky: jednu položku pro každou akci rozdělení, vložení a odstranění.
Při volání funkce CHANGETABLE pro výčet změn jsou tyto položky seřazeny podle hodnot primárního klíče a pak se operace agregují. Pokud aktualizace vloží nižší hodnotu, spustí se nejprve operace "I" na boční tabulce následovaná operací "D". To způsobí vrácení nesprávné operace pro tento řádek. Důvodem je to, že "I" následované "D" se agreguje jako "D".
Vzhledem k tomu, že v bočních tabulkách jsou zachovány pouze hodnoty primárního klíče, není nutné mít dvě samostatné položky. To platí, pokud se sloupec primárního klíče neaktualizuje.
Tento problém je opravený u neprimárních jedinečných sloupců. V tomto případě, když dojde k aktualizaci, pouze jeden řádek se vloží tak, že "U" jako operaci aktualizace místo dvou položek, které mají "D" a "I".
Odkazy
Přečtěte si o terminologii , kterou Microsoft používá k popisu aktualizací softwaru.