Triệu chứng
Khi bạn chạy một bản cập nhật trên bảng có chỉ mục liên cụm hoặc duy nhất và cập nhật xảy ra trên một cột duy nhất không phải là chính, bản ghi theo dõi thay đổi không nhất quán với câu lệnh cập nhật.
Ví dụ: giả sử một cột có tên là "cột1" được bao gồm trong chỉ mục liên cụm hoặc duy nhất. Khi giá trị cột được thay đổi từ giá trị lớn hơn thành giá trị nhỏ hơn (chẳng hạn như thay đổi giá trị từ 20 thành 16), bảng bên theo dõi thay đổi sẽ nhận được thao tác chèn trước thao tác xóa. Ví dụ: nhận được thao tác chèn bản ghi hàng nhật ký giao dịch trước khi thực hiện thao tác xóa hàng hoặc "I" được chèn trước "D".
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 |
Khi giá trị cột được thay đổi từ giá trị nhỏ hơn thành giá trị lớn hơn (chẳng hạn như thay đổi giá trị từ 16 thành 20), "D" sẽ được chèn trước "I".
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 |
Nguyên nhân
Sự cố này xảy ra do thứ tự không chính xác giữa các cặp xóa/chèn trong bảng bên theo dõi thay đổi.
Giải pháp
Bản sửa lỗi cho sự cố này được bao gồm trong các bản cập nhật sau đây dành cho SQL Server:
Bản cập nhật tích lũy 8 cho SQL Server 2017
Bản cập nhật Tích lũy 9 cho SQL Server 2016 Gói Dịch vụ 1
Giới thiệu SQL Server dựng
Mỗi bản dựng mới dành SQL Server sẽ chứa tất cả các bản cập nhật nóng và bản sửa lỗi bảo mật trong bản dựng trước đó. Chúng tôi khuyên bạn nên cài đặt bản dựng mới nhất cho SQL Server:
Bản cập nhật tích lũy mới nhất cho SQL Server 2017
Trạng thái
Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".
Thông tin Bổ sung
Đối với bảng bật chức năng theo dõi thay đổi, khi cập nhật xảy ra trên một cột không phải chính được xác định là duy nhất, hai mục nhập sẽ được chèn vào bảng bên theo dõi thay đổi: Một mục nhập cho mỗi hành động tách, Chèn và Xóa.
Khi hàm CHANGETABLE được gọi là liệt kê các thay đổi, các mục nhập này được sắp xếp theo giá trị khóa chính, sau đó các thao tác sẽ được tổng hợp. Nếu bản cập nhật chèn giá trị thấp hơn, thao tác "I" sẽ chạy trên bảng bên trước, tiếp theo là thao tác "D". Điều này gây ra một thao tác không chính xác được trả về cho hàng này. Điều này là do "I" theo sau "D" được tổng hợp là "D."
Vì chỉ có các giá trị khóa chính được duy trì trong các bảng bên, nó không phải là cần thiết để có hai mục riêng biệt. Điều này đúng miễn là cột khóa chính không được cập nhật.
Sự cố này đã được khắc phục đối với các cột duy nhất không phải là cột duy nhất chính. Trong trường hợp này, khi quá trình cập nhật diễn ra, chỉ có một hàng được chèn bằng cách có "U" làm thao tác cập nhật thay vì hai mục nhập có "D" và "I".
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft sử dụng để mô tả các bản cập nhật phần mềm.