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.