سؤال

كيف يمكنني مراقبة SQL Server قاعدة البيانات تغييرات على الجدول دون استخدام المشغلات أو تعديل هيكل قاعدة البيانات بأي شكل من الأشكال ؟ بلدي المفضل بيئة البرمجة هو .صافي و 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);

ومقارنة عاد اختبارية ضد القيم المخزنة.

هل كانت مفيدة؟

المحلول

نلقي نظرة على الاختباري الأمر:

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

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

المجموع الاختباري

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

نصائح أخرى

للأسف الاختباري لا تعمل دائما بشكل صحيح للكشف عن التغييرات.

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

لذلك لا يمكن استخدامه للكشف عن جميع التغيرات هـ.ز.متناظرة التغييرات النتيجة في نفس الاختباري!

E.ز.الحل مع CHECKSUM_AGG(BINARY_CHECKSUM(*)) سوف نقدم دائما 0 3 جميع الجداول مع محتوى مختلف:


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!

حدد CHECKSUM_AGG(BINARY_CHECKSUM(*)) من ( حدد 1 نوما ، 2 خدر الاتحاد جميع حدد 1 نوما ، 2 خدر ) س -- يسلم 0!

حدد CHECKSUM_AGG(BINARY_CHECKSUM(*)) من ( حدد 0 كما نوما, 0 كما خدر الاتحاد جميع حدد 0 كما نوما, 0 كما خدر ) س -- يسلم 0!

لماذا لا تريد استخدام المشغلات ؟ فهي شيء جيد إذا كنت تستخدم بشكل صحيح.إذا كنت استخدامها كوسيلة لفرض التكامل المرجعي هو عندما يذهبون من جيد إلى سيئ.ولكن إذا كنت استخدامها لرصد فهي لا تعتبر حقا من المحرمات.

كيف وغالبا ما كنت بحاجة للتحقق من التغييرات الكبرى (من حيث حجم صف) هل الجداول في قاعدة البيانات ؟ إذا كنت تستخدم CHECKSUM_AGG(BINARY_CHECKSUM(*)) طريقة اقترحها جون, وسوف تفحص كل صف من الجدول المحدد.على NOLOCK تلميح يساعد ، ولكن على قاعدة بيانات كبيرة, كنت لا تزال ضرب كل صف.سوف تحتاج أيضا إلى متجر الاختباري لكل صف بحيث تقول واحدة قد تغير.

هل فكرت في هذا من زاوية مختلفة ؟ إذا كنت لا ترغب في تعديل المخطط لإضافة مشغلات (الأمر الذي يجعل الشعور, انها ليست قاعدة البيانات الخاصة بك) ، هل تعتبر العمل مع بائع التطبيق التي لا تجعل قاعدة البيانات ؟

تنفيذ API التي توفر آلية إخطار الملحق التطبيقات التي تغير البيانات.يمكن أن تكون بسيطة مثل كتابة الاشعار الجدول الذي يسرد ما جدول الصف الذي تم تعديله.التي يمكن تنفيذها من خلال المشغلات أو رمز التطبيق.من الجانب الخاص بك ، ti لا يهم سوى القلق قد يكون مسح إعلام الجدول على أساس دوري.أداء ضرب على قاعدة البيانات سيكون أقل بكثير من مسح كل صف التغيرات.

الجزء الصعب قد تكون مقنعة ببائع التطبيق لتنفيذ هذه الميزة.لأن هذا يمكن أن تكون مقابض تماما من خلال SQL عبر المشغلات يمكنك القيام بالجزء الأكبر من العمل بالنسبة لهم خلال كتابة و اختبار المشغلات ثم جلب رمز ببائع التطبيق.من خلال وجود دعم الموردين المشغلات ، منع الوضع حيث إضافة الزناد عن غير قصد محل الزناد الموردة من قبل البائع.

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

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

مثال الاستعلام بإرجاع معلومات حول كافة الأعمدة في الجدول ABC (مثالي سرد مجرد أعمدة من INFORMATION_SCHEMA الجدول الذي تريده بدلا من استخدام *حدد ** كما أفعل هنا):

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

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

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

تحقق آخر لارتكاب التاريخ.كل قاعدة البيانات لديها تاريخ من عند ارتكاب كل مصنوع.اعتقد ان مستوى حمض الامتثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top