استعلام للحصول على كافة المراجعات للرسم البياني للكائن

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

إذا حصلت على قائمة بالدول ذات المقاطعات، فسيبدو الاتحاد كما يلي:

SELECT c.CreatedAt AS RevisionId from Countries as c where localId=@Country
UNION
SELECT p.CreatedAt AS RevisionId from Provinces as p 
INNER JOIN Countries as c ON p.CountryId=c.LocalId AND c.LocalId = @Country
UNION
SELECT c.RemovedAt AS RevisionId from Countries as c where localId=@Country
UNION
SELECT p.RemovedAt AS RevisionId from Provinces as p 
INNER JOIN Countries as c ON p.CountryId=c.LocalId AND c.LocalId = @Country

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

أحتاجهم جميعًا في قائمة واحدة لأنه يتم استخدامه في جملة من والبيانات الحقيقية تأتي من الانضمام إلى هذا.

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

المحلول

على الأرجح أنك قد قمت بالفعل بتنفيذ الحل الخاص بك، ولكن لمعالجة بعض المشكلات؛أود أن أقترح النظر في حل Aleris، أو بعض مشتقاته.

  • في جداولك، لديك حقل "تمت إزالته في" - حسنًا، إذا كان هذا الحقل نشطًا (مملوءًا)، فمن الناحية الفنية لا ينبغي أن تكون البيانات موجودة - أو ربما تم وضع علامة على التنفيذ الخاص بك للحذف، مما سيؤدي إلى قطع التسجيل بمجرد ذلك يكون إزالة.
  • ماذا يحدث عندما يكون لديك تحديثات متعددة خلال فترة التقرير - سيتم استبدال إدخالات السجل السابقة.
  • يسمح وجود سجل منفصل بأرشفة معلومات السجل ويسمح لك بتعيين دورة تحليل سجل مختلفة عن دورات التحديث/التحرير الخاصة بك.
  • قم بإضافة أي حقول "ربط" مطلوبة لتمكينك من العودة إلى بيانات المصدر الأصلية أو جعل الأوصاف مطولة بما فيه الكفاية.

    إن الحقول الموجودة في السجل الخاص بك متروكة لك ولكن حل Aleris مباشر.يمكنني إنشاء جدول إجراء وتغيير نوع الحقل من varchar إلى int، كرابط إلى جدول الإجراء - مما يجبر المطورين على اتخاذ بعض الإجراءات الموحدة.

    نأمل أن يساعد.

  • نصائح أخرى

    وبديل سيكون لإنشاء سجل التدقيق التي قد تبدو مثل هذا:

    AuditLog table
        EntityName varchar(2000),
        Action varchar(255),
        EntityId int,
        OccuranceDate datetime
    

    وحيث EntityName هو اسم الجدول (على سبيل المثال: CONTRIES، الأقاليم)، والعمل هو عمل التدقيق (على سبيل المثال: مكون، إزالة الخ). وEntityId هو المفتاح الأساسي من الصف تعديل في الجدول الأصلي

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

    1) تقديم محفزات على كل طاولة من شأنها أن تضيف إلى صفوف AuditTable
    2) من التطبيق الخاص بك إضافة صفوف في AuditTable كل مرة يتم فيها تغيير على repectivetables

    <ع> استخدام هذا الحل بسيط جدا للحصول على قائمة السجلات في التدقيق.

    إذا كنت بحاجة للحصول على أعمدة من الجدول الأصلي من الممكن أيضا استخدام ينضم مثل هذا:

    select *
    from 
        Contries C 
        join AuditLog L on C.Id = L.EntityId and EntityName = 'Contries'
    

    وربما كنت قد تفعل ذلك مع وجود تقاطع الانضمام والاندماج، ولكن الاتحاد هو ربما لا يزال أفضل من وجهة نظر الأداء. يمكنك محاولة اختبار كل بالرغم من ذلك.

    SELECT
         COALESCE(C.CreatedAt, P.CreatedAt)
    FROM
         dbo.Countries C
    FULL OUTER JOIN dbo.Provinces P ON
         1 = 0
    WHERE
         C.LocalID = @Country OR
         P.LocalID = @Country
    
    مرخصة بموجب: CC-BY-SA مع الإسناد
    لا تنتمي إلى StackOverflow
    scroll top