كيفية - تحقق من التغييرات على جدول SQL Server؟




كيفية انشاء جدول في sql (6)

ألقِ نظرة على الأمر CHECKSUM:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

سيعود ذلك بنفس الرقم في كل مرة يتم تشغيله طالما أن محتويات الجدول لم تتغير. انظر مشاركتي في هذا لمزيد من المعلومات:

CHECKSUM

إليك كيفية استخدامها لإعادة إنشاء تبعيات ذاكرة التخزين المؤقت عند تغيير الجداول:
ASP.NET 1.1 قاعدة بيانات التخزين المؤقت التبعية (بدون المشغلات)

كيف يمكنني مراقبة قاعدة بيانات SQL Server للتغييرات على جدول دون استخدام المشغلات أو تعديل بنية قاعدة البيانات بأي طريقة؟ بيئة البرمجة المفضلة لدي هي .NET و C #.

أود أن أكون قادراً على دعم أي SQL Server 2000 SP4 أو الأحدث. تطبيقي عبارة عن تصوُّر بيانات مثبت على معلومات منتج شركة أخرى. قاعدة العملاء لدينا هي بالآلاف ، لذلك لا أرغب في وضع متطلبات نقوم بتعديل جدول موردي الطرف الثالث في كل عملية تثبيت.

يعني "التغييرات في جدول" التغييرات في بيانات الجدول ، وليس التغييرات في بنية الجدول.

في النهاية ، أود أن يؤدي التغيير إلى تشغيل حدث في طلبي ، بدلاً من الاضطرار إلى التحقق من التغييرات في فترة زمنية.

يبدو أن أفضل طريقة للعمل وفقًا لمتطلباتي (لا توجد مشغلات أو تعديل مخطط ، SQL Server 2000 و 2005) هي استخدام الدالة BINARY_CHECKSUM في T-SQL . الطريقة التي أخطط لتنفيذها هي:

كل X ثانية تشغيل الاستعلام التالي:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

وقارن ذلك مقابل القيمة المخزنة. إذا تغيرت القيمة ، فانتقل إلى صف الجدول تلو الآخر باستخدام الاستعلام:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

ومقارنة اختباري التي تم إرجاعها مقابل القيم المخزنة.


تحقق من تاريخ الالتزام الأخير. كل قاعدة بيانات لها تاريخ عندما يتم كل التزام. وأعتقد أن معيار الامتثال حمض.


لديك وظيفة DTS (أو وظيفة يتم تشغيلها بواسطة خدمة windows) يتم تشغيلها في فاصل زمني محدد. في كل مرة يتم تشغيلها ، تحصل على معلومات حول الجدول المحدد باستخدام جداول INFORMATION_SCHEMA للنظام ، وتسجل هذه البيانات في مستودع البيانات. مقارنة البيانات التي تم إرجاعها فيما يتعلق بهيكل الجدول مع البيانات التي تم إرجاعها في الوقت السابق. إذا كان الأمر مختلفًا ، فأنت تعلم أن الهيكل قد تغير.

مثال على الاستعلام لإرجاع المعلومات المتعلقة بجميع الأعمدة في الجدول ABC (من الأفضل إدراج الأعمدة من جدول INFORMATION_SCHEMA الذي تريده ، بدلاً من استخدام * select ** مثلما أفعل هنا):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

يمكنك مراقبة أعمدة مختلفة وعروض INFORMATION_SCHEMA اعتمادًا على كيفية تحديد "التغييرات في جدول" بالضبط.


لسوء الحظ ، لا أعتقد أن هناك طريقة نظيفة للقيام بذلك في SQL2000. إذا قمت بتضييق متطلباتك على SQL Server 2005 (والإصدارات الأحدث) ، فأنت في العمل. يمكنك استخدام فئة SQLDependency في System.Data.SqlClient . راجع إعلامات الاستعلام في SQL Server (ADO.NET) .


وايلد تخمين هنا: إذا كنت لا ترغب في تعديل جداول الطرف الثالث ، هل يمكنك إنشاء طريقة عرض ومن ثم وضع الزناد على هذا الرأي؟


لسوء الحظ ، لا يعمل CHECKSUM دائمًا بشكل صحيح للكشف عن التغييرات .

إنه فقط المجموع الاختباري البدائي وليس حساب فحص التكرار الدوري (CRC).

لذلك لا يمكنك استخدامه للكشف عن جميع التغييرات ، على سبيل المثال ، تؤدي التغييرات المتماثلة إلى نفس CHECKSUM!

إي. الحل الذي يقدم CHECKSUM_AGG(BINARY_CHECKSUM(*)) دائمًا سيوفر 0 لجميع الجداول الثلاثة ذات المحتوى المختلف:


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!





rdbms