KB4135113 – OPRAVA: Záznam sledování změn je nekonzistentní při aktualizaci tabulky, která má clusterový nebo jedinečný index v SQL Server

Platí pro
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows

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.