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 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 لوصف تحديثات البرامج.