Příznaky
Pokud spustíte aktualizaci tabulky, která má clusterovaný nebo jedinečný index, a k aktualizaci dojde v jiném než primárním jedinečném sloupci, není záznam sledování změn konzistentní s příkazem Update.
Předpokládejme například, že sloupec s názvem Sloupec1 je zahrnutý do seskupeného nebo jedinečného indexu. Když se hodnota sloupce změní z větší na menší (například změna hodnoty z 20 na 16), obdrží boční tabulka sledování změn operaci vložení před operací odstranění. Například operace vložení řádku Record transakčního protokolu se přijme před operací odstranění řádku nebo se před D" vloží "I".
| Sys_change_version | sys_change_create_version | sys_change_operation | sys_change_column | sys_change_context | PK_column |
|---|---|---|---|---|---|
| 1116 | 19 | K | NULL | NULL | 5639485628 |
| 1116 | 20 | D | NULL | NULL | 5639485628 |
Když hodnotu sloupce změníte z menší na větší (například změníte hodnotu z 16 na 20), vloží se před "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 | K | NULL | NULL | 5639485628 |
Příčina
K tomuto problému dochází kvůli nesprávnému řazení mezi dvojicemi Odstranit/Vložit v boční tabulce 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
Kumulativní aktualizace 12 pro SQL Server 2014 SP2
O buildech systému SQL Server
Každý nový build 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
Nejnovější build pro SQL Server 2016
Nejnovější kumulativní aktualizace pro SQL Server 2014
Stav
Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.
Další informace
V tabulce s povoleným sledováním změn platí, že pokud dojde k aktualizaci neprimárního sloupce, který je definován jako jedinečný, vloží se do boční tabulky sledování změn dvě položky: Jedna položka pro každou z akcí rozdělení, Vložit a Odstranit.
Když je volána funkce CHANGETABLE za účelem výpočtu výčtu změn, jsou tyto položky seřazeny podle hodnot primárního klíče a operace jsou následně agregovány. Pokud aktualizace vloží nižší hodnotu, spustí se nejprve operace "I" na boční tabulce, po které následuje operace "D". To způsobí, že pro tento řádek bude vrácena nesprávná operace. Je to proto, že "I" následovalo "D" je agregováno jako "D".
Vzhledem k tomu, že se v bočních tabulkách zachovávají pouze hodnoty primárního klíče, není nutné vytvářet dvě samostatné položky. Platí to tak dlouho, dokud není aktualizován sloupec primárního klíče.
Tento problém jsme opravili u jiných než primárních jedinečných sloupců. V tomto případě se při aktualizaci vloží jenom jeden řádek s "U" jako operací aktualizace místo dvou položek, které mají "D" a "I".
Reference
Přečtěte si o terminologii , kterou společnost Microsoft používá k popisování aktualizací softwaru.