KB4135113 - การแก้ไข: การเปลี่ยนแปลงระเบียนการติดตามไม่สอดคล้องกันระหว่างการอัปเดตบนตารางที่มีดัชนีแบบคลัสเตอร์หรือดัชนีที่ไม่ซ้ํากันใน SQL Server

นำไปใช้กับ
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows

อาการ

เมื่อคุณเรียกใช้การอัปเดตในตารางที่มีดัชนีแบบคลัสเตอร์หรือดัชนีที่ไม่ซ้ํากัน และการอัปเดตเกิดขึ้นในคอลัมน์ที่ไม่ใช่คอลัมน์ที่ไม่ซ้ํากันหลัก ระเบียนการติดตามการเปลี่ยนแปลงไม่สอดคล้องกับคําสั่งการอัปเดต

ตัวอย่างเช่น สมมติว่าคอลัมน์ที่ชื่อ "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 I 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 I NULL NULL 5639485628

สาเหตุ

ปัญหานี้เกิดขึ้นเนื่องจากการจัดลําดับที่ไม่ถูกต้องระหว่างคู่ลบ/แทรกในตารางด้านการติดตามการเปลี่ยนแปลง

การแก้ปัญหา

การแก้ไขสําหรับปัญหานี้จะรวมอยู่ในการอัปเดตสําหรับ SQL Server ต่อไปนี้:

การอัปเดตสะสม 8 สําหรับ SQL Server 2017

การอัปเดตสะสม 9 สําหรับ SQL Server 2016 Service Pack 1

การอัปเดตสะสม 12 สําหรับ SQL Server 2014 SP2

เกี่ยวกับรุ่น SQL Server

แต่ละรุ่นใหม่สําหรับ SQL Server ประกอบด้วยการแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่อยู่ในรุ่นก่อนหน้า เราขอแนะนําให้คุณติดตั้งรุ่นล่าสุดสําหรับ SQL Server:

การอัปเดตสะสมล่าสุดสําหรับ SQL Server 2017

รุ่นล่าสุดสําหรับ SQL Server 2016

การอัปเดตสะสมล่าสุดสําหรับ SQL Server 2014

สถานะ

Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"

ข้อมูลเพิ่มเติม

สําหรับตารางที่เปิดใช้งานการติดตามการเปลี่ยนแปลง เมื่อมีการอัปเดตเกิดขึ้นในคอลัมน์ที่ไม่ใช่คอลัมน์หลักซึ่งถูกกําหนดให้ไม่ซ้ํากัน สองรายการจะถูกแทรกลงในตารางด้านข้างการติดตามการเปลี่ยนแปลง: หนึ่งรายการสําหรับแต่ละการดําเนินการแยก แทรก และ ลบ

เมื่อฟังก์ชัน CHANGETABLE ถูกเรียกให้แจงนับการเปลี่ยนแปลง รายการเหล่านี้จะถูกเรียงลําดับตามค่าคีย์หลัก แล้วการดําเนินการจะถูกรวม ถ้าการอัปเดตแทรกค่าที่ต่ํากว่า การดําเนินการ "I" จะทํางานบนตารางด้านข้างก่อน ตามด้วยการดําเนินการ "D" ซึ่งทําให้การดําเนินการที่ไม่ถูกต้องถูกส่งกลับสําหรับแถวนี้ เนื่องจาก "I" ตามด้วย "D" ถูกรวมเป็น "D"

เนื่องจากเฉพาะค่าคีย์หลักเท่านั้นที่จะถูกเก็บรักษาไว้ในตารางด้านข้าง จึงไม่จําเป็นต้องมีรายการแยกกันสองรายการ ค่านี้เป็นจริงตราบใดที่คอลัมน์คีย์หลักไม่ได้รับการอัปเดต

ปัญหานี้ได้รับการแก้ไขแล้วสําหรับคอลัมน์ที่ไม่ซ้ํากันที่ไม่ใช่คอลัมน์หลัก ในกรณีนี้ เมื่อการอัปเดตเกิดขึ้น จะมีการแทรกแถวเพียงหนึ่งแถวโดยมี "U" เป็นการดําเนินการอัปเดตแทนที่จะเป็นสองรายการที่มี "D" และ "I"

การอ้างอิง

เรียนรู้เกี่ยวกับ คําศัพท์เฉพาะทาง ที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์