باستخدام تغيير البيانات لتطبيقات سطح المكتب الصغيرة؟

StackOverflow https://stackoverflow.com/questions/469903

سؤال

يحتوي عميل جديد لي على تطبيق قاعدة بيانات VB/Access صغير مكتوب في عام 2002 الذي يريد إعادة كتابته لإحضاره أكثر ودعم ميزات جديدة كان يريدها لبعض الوقت. لذلك ، سأقوم بتحويله لاستخدام C#.NET 2008 و SQL Server Express 2008 على الجهاز المحلي مع القدرة على التوسع في استخدام WCF و SQL Server 2008 على خادم بعيد.

واحدة من الميزات الجديدة التي يهتم بها هي الحفاظ على تاريخ تغييرات البيانات الكامل والإبلاغ عنها على مدار فترة زمنية. في الماضي ، قمت بذلك من خلال استخدام المشغلات والإجراءات المخزنة ، وهو ألم في @!#$.

لقد حصلت على حكة مؤخرًا للعبث مع ميزات التقاط بيانات التغيير في SQL Server 2008. خلال ساعة اللعب الأولى من اللعب معها ، أدركت أنه ينشئ وظيفة في وكيل SQL يتم تشغيله افتراضيًا كل 5 ثوانٍ. يبدو أيضًا أنه أكثر من ألم عندما أحتاج إلى تغيير مخطط الطاولات التي تم التقاطها. بخلاف ذلك ، يبدو أن التنفيذ أسهل بكثير من طريقتي الأصلية. لذلك ، هذه هي أسئلتي:

  1. هل هذا مفرط لتطبيق سطح المكتب الصغير الذي قد ينتقل أو لا ينحرف في النهاية إلى خادم بعيد؟
  2. ماذا يجب أن أتوقع من حيث الأداء؟ مع زيادة حجم قاعدة البيانات الخاصة به ، هل سأتلقى المزيد من المكالمات منه قائلاً إن جهاز الكمبيوتر الخاص به يعمل بطيئًا؟
  3. هل هناك أي مسكات أخرى مع CDC يجب أن أكون على دراية بها من أي شخص يستخدمه حاليًا في الإنتاج؟
  4. هل لدى أي شخص أي روابط لطرقه المفضلة لتتبع التغييرات بمرور الوقت والتي قد تكون مناسبة بشكل أفضل لتطبيق سطح المكتب الصغير؟

شكرًا،

مارك

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

المحلول

يتوفر CDC فقط في SQL Server Enterprise Edition. لذلك إذا كنت تعبر عنك ، فلن تتمكن من استخدامه وعليك أن تبقى مع المشغلات.

نصائح أخرى

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

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

على افتراض أن لديك بالفعل مشغلات لإنشاء صفوف تدقيق وجدول المصدر الخاص بك يحتوي على عمود يسمى "إصدار" من Type Rowversion:

INSERT INTO [Changes].Sites
(
    SiteID,
    Operation,
    Version,
    ModifiedOn,
    DataChange
)
SELECT
    IsNull( I.SiteID, D.SiteID ),
    CASE
        WHEN D.[Version] IS NULL      AND I.[Version] IS NOT NULL  THEN 'I'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NOT NULL  THEN 'U'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NULL      THEN 'D'
        ELSE '?'
    END,
    IsNull( I.Version, D.Version ),
    SysDateTimeOffset(),
    (
        SELECT
            [Deleted] = ( SELECT * FROM deleted D1 WHERE D1.SiteID = D.SiteID FOR XML PATH(''), TYPE ),
            [Inserted] = ( SELECT * FROM inserted I1 WHERE I1.SiteID = I.SiteID FOR XML PATH(''), TYPE )
        FOR XML PATH('Changes')
    )
FROM deleted D
FULL JOIN inserted I
    ON D.SiteID = I.SiteID

الشيء الوحيد في هذا الاستعلام المخصص لجدولتي هو المفتاح الأساسي. سيكون إنشاء قالب لإنشاء هذه الاستعلامات أمرًا بسيطًا إلى حد ما (يمكن أن يفعل ذلك في SQL باستخدام sys.tables وما إلى ذلك).

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