KB4135113 — POPRAWKA: Rekord śledzenia zmian jest niespójny podczas aktualizacji w tabeli, która ma indeks grupowany lub unikatowy w SQL Server

Dotyczy
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

Objawy

W przypadku uruchomienia aktualizacji dla tabeli zawierającej indeks grupowany lub unikatowy i aktualizacja występuje w innej niż podstawowa unikatowej kolumnie, rekord śledzenia zmian jest niezgodny z instrukcją update.

Załóżmy na przykład, że kolumna o nazwie "kolumna1" jest uwzględniona w indeksie grupowanym lub unikatowym. Gdy wartość w kolumnie zostanie zmieniona z większej na mniejszą (na przykład z 20 na 16), przed operacją usuwania w tabeli bocznej śledzenia zmian zostanie wykonana operacja wstawiania. Na przykład operacja wstawiania wiersza dziennika transakcji jest odbierana przed operacją usuwania wiersza lub przed literą "D" jest wstawiany znak "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

Gdy wartość w kolumnie zostanie zmieniona z mniejszej na większą (na przykład z 16 na 20), przed literą "I" zostanie wstawiona litera "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

Przyczyna

Ten problem jest spowodowany nieprawidłową kolejnością par usuwanie/wstawianie w tabeli bocznej śledzenia zmian.

Rozwiązanie

Rozwiązanie tego problemu znajduje się w następujących aktualizacjach dla programu SQL Server:

Aktualizacja zbiorcza 8 dla programu SQL Server 2017

Aktualizacja zbiorcza 9 dla programu SQL Server 2016 z dodatkiem Service Pack 1

Aktualizacja zbiorcza 12 dla programu SQL Server 2014 z dodatkiem SP2

Informacje o kompilacjach programu SQL Server

Każda nowa kompilacja programu SQL Server zawiera wszystkie poprawki zabezpieczeń z poprzedniej kompilacji. Zalecamy zainstalowanie najnowszej kompilacji programu SQL Server:

Najnowsza aktualizacja zbiorcza dla programu SQL Server 2017

najnowsza kompilacja dla programu SQL Server 2016

Najnowsza aktualizacja zbiorcza dla programu SQL Server 2014

Stan

Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.

Więcej informacji

W przypadku tabeli z włączoną obsługą śledzenia zmian, gdy aktualizacja dotyczy kolumny innej niż podstawowa, która została zdefiniowana jako unikatowa, do tabeli bocznej śledzenia zmian są wstawiane dwa wpisy: po jednym wpisie dla każdej akcji podziału: Wstaw i Usuń.

Gdy wywołuje się funkcję CHANGETABLE w celu wyliczenia zmian, wpisy te są sortowane według wartości klucza podstawowego, a następnie operacje są agregowane. Jeśli aktualizacja spowoduje wstawienie niższej wartości, najpierw zostanie uruchomiona operacja "I" na bocznej tabeli, a następnie operacja "D". Powoduje to zwrócenie niepoprawnej operacji dla tego wiersza. Jest tak, ponieważ litera "I", po której następuje litera "D", jest agregowana jako "D".

Ponieważ w tabelach pobocznych są przechowywane tylko wartości kluczy podstawowych, nie ma potrzeby wprowadzania dwóch osobnych wpisów. Dzieje się tak, o ile kolumna klucza podstawowego nie jest aktualizowana.

Ten problem rozwiązano dla innych niż podstawowe unikatowe kolumny. W takim przypadku podczas aktualizacji tylko jeden wiersz jest wstawiany przez operację aktualizacji "P" zamiast dwóch wpisów, które mają litery "D" i "I".

Źródła informacji

Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.