Symptomy
Po uruchomieniu aktualizacji dla tabeli, która ma indeks grupowany lub unikatowy i aktualizacja występuje w nie podstawowej kolumnie unikatowej, rekord śledzenia zmian jest niezgodny z instrukcją aktualizacji.
Załóżmy na przykład, że kolumna o nazwie "kolumna1" jest uwzględniana w indeksie grupowanym lub unikatowym. Gdy wartość kolumny zostanie zmieniona z większej na mniejszą (na przykład ze zmiany wartości z 20 na 16), tabela boczna śledzenia zmian otrzyma operację wstawiania przed operacją usunięcia. Na przykład operacja wstawiania rekordu wiersza dziennika transakcji jest odbierana przed operacją usunięcia wiersza lub przed "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ść kolumny zostanie zmieniona z mniejszej na większą (na przykład zmieni wartość z 16 na 20), przed "I" zostanie wstawiona wartość "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 występuje z powodu nieprawidłowej kolejności między parami usuwania/wstawiania w tabeli bocznej śledzenia zmian.
Rozwiązanie
Poprawka rozwiązła ten problem jest zawarta w następujących aktualizacjach dla SQL Server:
Aktualizacja zbiorcza 8 dla SQL Server 2017
Aktualizacja zbiorcza 9 dodatku Service Pack 1 dla SQL Server 2016
Aktualizacja zbiorcza 12 dla SQL Server 2014 z dodatkiem SP2
Informacje o kompilacjach SQL Server
Każda nowa kompilacja dla SQL Server zawiera wszystkie poprawki i poprawki zabezpieczeń, które były w poprzedniej kompilacji. Zalecamy zainstalowanie najnowszej kompilacji dla SQL Server:
Najnowsza aktualizacja zbiorcza dla SQL Server 2017
Stan
Firma Microsoft potwierdziła, że jest to problem w produktach firmy Microsoft wymienionych w sekcji "Dotyczy".
Więcej informacji
W przypadku tabeli z włączoną funkcją śledzenia zmian w przypadku wystąpienia aktualizacji w kolumnie innej niż podstawowa, która jest zdefiniowana jako unikatowa, do tabeli bocznej śledzenia zmian są wstawiane dwa wpisy: jeden wpis dla każdej z akcji podziału, Insert i Delete.
Gdy funkcja CHANGETABLE jest wywoływana w celu wyliczenia zmian, wpisy te są sortowane według wartości klucza podstawowego, a następnie operacje są agregowane. Jeśli aktualizacja wstawia niższą wartość, najpierw w tabeli bocznej jest uruchamiana operacja "I", a następnie operacja "D". Powoduje to zwrócenie nieprawidłowej operacji dla tego wiersza. Dzieje się tak dlatego, że ciąg "I" po "D" jest agreguje się jako "D".
Ponieważ w tabelach bocznych są zachowywane tylko wartości kluczy podstawowych, nie trzeba mieć dwóch oddzielnych wpisów. Jest tak, dopóki kolumna klucza podstawowego nie zostanie zaktualizowana.
Ten problem został rozwiązany w przypadku niepodstawowych kolumn unikatowych. W takim przypadku w przypadku aktualizacji tylko jeden wiersz jest wstawiany przez operację aktualizacji "U" zamiast dwóch wpisów o literach "D" i "I".
Informacje
Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.