อาการ
เมื่อคุณเรียกใช้การอัปเดตในตารางที่มีดัชนีแบบคลัสเตอร์หรือดัชนีที่ไม่ซ้ํากัน และการอัปเดตเกิดขึ้นในคอลัมน์ที่ไม่ใช่คอลัมน์ที่ไม่ซ้ํากันหลัก ระเบียนการติดตามการเปลี่ยนแปลงไม่สอดคล้องกับคําสั่งการอัปเดต
ตัวอย่างเช่น สมมติว่าคอลัมน์ที่ชื่อ "column1" ถูกรวมอยู่ในดัชนีแบบกลุ่มหรือดัชนีที่ไม่ซ้ํากัน เมื่อค่าของคอลัมน์ถูกเปลี่ยนจากค่าที่มากกว่าเป็นค่าที่น้อยกว่า (เช่น การเปลี่ยนค่าจาก 20 เป็น 16) ตารางด้านการติดตามการเปลี่ยนแปลงจะได้รับการดําเนินการแทรกก่อนการดําเนินการลบ ตัวอย่างเช่น ได้รับการดําเนินการแทรกระเบียนแถวของบันทึกทรานแซคชันก่อนที่จะมีการลบการดําเนินการของแถว หรือ "I" จะถูกแทรกก่อน "D"
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1116 |
19 |
ฉัน |
NULL |
NULL |
5639485628 |
1116 |
20 |
D |
NULL |
NULL |
5639485628 |
เมื่อค่าของคอลัมน์ถูกเปลี่ยนจากน้อยกว่าเป็นค่าที่มากกว่า (เช่น การเปลี่ยนค่าจาก 16 เป็น 20) "D" จะถูกแทรกก่อน "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 |
ฉัน |
NULL |
NULL |
5639485628 |
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจากการจัดลําดับที่ไม่ถูกต้องระหว่างคู่ลบ/แทรกในตารางด้านการติดตามการเปลี่ยนแปลง
การแก้ไข
การแก้ไขสําหรับปัญหานี้จะรวมอยู่ในการอัปเดตสําหรับSQL Serverต่อไปนี้:
การอัปเดตสะสม 8 สําหรับ SQL Server 2017
การอัปเดตสะสม 9 สําหรับ SQL Server 2016 Service Pack 1
เกี่ยวกับรุ่นSQL Server
แต่ละรุ่นใหม่สําหรับSQL Serverประกอบด้วยการแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่อยู่ในรุ่นก่อนหน้า เราขอแนะนําให้คุณติดตั้งรุ่นล่าสุดสําหรับ SQL Server:
การอัปเดตสะสมล่าสุดสําหรับ SQL Server 2017
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
ข้อมูลเพิ่มเติม
สําหรับตารางที่เปิดใช้งานการติดตามการเปลี่ยนแปลง เมื่อมีการอัปเดตเกิดขึ้นในคอลัมน์ที่ไม่ใช่คอลัมน์หลักซึ่งถูกกําหนดให้ไม่ซ้ํากัน สองรายการจะถูกแทรกลงในตารางด้านข้างการติดตามการเปลี่ยนแปลง: หนึ่งรายการสําหรับแต่ละการดําเนินการแยก แทรก และ ลบ
เมื่อฟังก์ชัน CHANGETABLE ถูกเรียกให้แจงนับการเปลี่ยนแปลง รายการเหล่านี้จะถูกเรียงลําดับตามค่าคีย์หลัก แล้วการดําเนินการจะถูกรวม ถ้าการอัปเดตแทรกค่าที่ต่ํากว่า การดําเนินการ "I" จะทํางานบนตารางด้านข้างก่อน ตามด้วยการดําเนินการ "D" ซึ่งทําให้การดําเนินการที่ไม่ถูกต้องถูกส่งกลับสําหรับแถวนี้ เนื่องจาก "I" ตามด้วย "D" ถูกรวมเป็น "D"
เนื่องจากเฉพาะค่าคีย์หลักเท่านั้นที่จะถูกเก็บรักษาไว้ในตารางด้านข้าง จึงไม่จําเป็นต้องมีรายการแยกกันสองรายการ ค่านี้เป็นจริงตราบใดที่คอลัมน์คีย์หลักไม่ได้รับการอัปเดต
ปัญหานี้ได้รับการแก้ไขแล้วสําหรับคอลัมน์ที่ไม่ซ้ํากันที่ไม่ใช่คอลัมน์หลัก ในกรณีนี้ เมื่อการอัปเดตเกิดขึ้น แถวเดียวเท่านั้นจะถูกแทรกโดยมี "U" เป็นการดําเนินการอัปเดตแทนที่จะเป็นสองรายการที่มี "D" และ "I"
อ้างอิง
เรียนรู้เกี่ยวกับ คําศัพท์เฉพาะทาง ที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์