Gejala
Saat Anda menjalankan pembaruan pada tabel yang memiliki indeks tergugus atau unik dan pembaruan terjadi pada kolom unik non-utama, rekaman pelacakan perubahan tidak konsisten dengan pernyataan pembaruan.
Misalnya, anggaplah bahwa kolom yang bernama "kolom1" disertakan dalam indeks tergugus atau unik. Ketika nilai kolom diubah dari yang lebih besar menjadi nilai yang lebih kecil (seperti mengubah nilai dari 20 ke 16), tabel sisi pelacakan perubahan menerima operasi sisipkan sebelum operasi penghapusan. Misalnya, operasi sisipkan catatan baris log transaksi diterima sebelum operasi hapus baris, atau "I" disisipkan sebelum "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 |
Ketika nilai kolom diubah dari yang lebih kecil menjadi nilai yang lebih besar (seperti mengubah nilai dari 16 menjadi 20), "D" disisipkan sebelum "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 |
Penyebab
Masalah ini terjadi karena pengurutan yang salah antara pasangan hapus/sisipkan dalam tabel sisi pelacakan perubahan.
Pemecahan Masalah
Perbaikan untuk masalah ini disertakan dalam pembaruan berikut untuk SQL Server:
Pembaruan Kumulatif 8 untuk SQL Server 2017
Pembaruan Kumulatif 9 untuk SQL Server 2016 Paket Layanan 1
Tentang build SQL Server
Setiap build baru untuk SQL Server berisi semua perbaikan keamanan dan hotfix yang ada di build sebelumnya. Kami menyarankan agar Anda menginstal build terbaru untuk SQL Server:
Pembaruan kumulatif terbaru untuk SQL Server 2017
Status
Microsoft telah mengonfirmasi bahwa ini adalah masalah pada produk Microsoft yang tercantum di bagian "Berlaku untuk".
Informasi selengkapnya
Untuk tabel yang diaktifkan pelacakan perubahan, ketika pembaruan terjadi pada kolom non-utama yang ditentukan unik, dua entri disisipkan ke tabel sisi pelacakan perubahan: Satu entri untuk setiap tindakan terpisah, Sisipkan dan Hapus.
Ketika fungsi CHANGETABLE dipanggil untuk menghitung perubahan, entri ini diurutkan menurut nilai kunci utama, lalu operasi diagregat. Jika pembaruan menyisipkan nilai yang lebih rendah, operasi "I" dijalankan di tabel samping terlebih dahulu, diikuti dengan operasi "D". Hal ini menyebabkan operasi yang salah dikembalikan untuk baris ini. Ini karena "I" diikuti "D" diagregat sebagai "D."
Karena hanya nilai kunci utama yang dipertahankan dalam tabel samping, tidak perlu memiliki dua entri terpisah. Hal ini berlaku selama kolom kunci utama tidak diperbarui.
Masalah ini telah diperbaiki untuk kolom unik non-utama. Dalam hal ini, ketika pembaruan terjadi, hanya satu baris yang disisipkan dengan memiliki "U" sebagai operasi pembaruan, bukan dua entri yang memiliki "D" dan "I."
Referensi
Pelajari tentang terminologi yang digunakan Microsoft untuk menjelaskan pembaruan perangkat lunak.