مشغلات التدقيق: استخدام جداول النظام المدرجة أو المحذوفة

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

سؤال

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

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

النهج 1: تخزينها، في جداول التدقيق، فقط هذه السجلات التي يتم استبدالها / المحذوفة من الجدول الرئيسي (باستخدام جدول النظام المحذوف). لذلك لكل تحديث وحذف في الجدول الرئيسي، يتم إدراج السجل الذي يتم استبداله في جدول التدقيق باستخدام عمود "Audit_Type" كمعالجة "U" (للتحديث) أو "D '(للحذف)

إدراج غير مراجعة. للحصول على الإصدار الحالي من أي سجل، يمكنك دائما الاستعلام عن الجدول الرئيسي. وللاريخ، يمكنك استعلام جدول التدقيق.

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

appraoch 2: تخزين، في جدول التدقيق، كل سجل يدخل في الجدول الرئيسي (باستخدام جدول النظام المدرج).

يتم تخزين كل سجل مدرج / محدث / حذف إلى الجدول الرئيسي أيضا في جدول التدقيق. لذلك عند إدراج سجل جديد، يتم إدراجه أيضا في جدول التدقيق. عند تحديثه، يتم تخزين الجدول الإصدار الجديد (من إدراج) في جدول التدقيق. عند حذفه، يتم تخزين الجدول الإصدار القديم (من المحذوف) في جدول التدقيق.

الايجابيات: إذا كنت بحاجة إلى معرفة تاريخ سجل معين، فلديك كل شيء في مكان واحد.

على الرغم من أنني لم أذكر كل منهم هنا، إلا أن كل منهج له إيجابيات وسلبياتها؟

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

المحلول

سأذهب مع:

appraoch 2: تخزين، في جدول التدقيق، كل سجل يدخل في الجدول الرئيسي (باستخدام جدول النظام المدرج).

هو صف آخر لكل عنصر سوف يقتل db؟ بهذه الطريقة لديك تاريخ كامل معا.

إذا قمت بتطهير الصفوف (مجموعة أكبر من x يوم x)، فلا يزال بإمكانك معرفة ما إذا كان هناك شيء قد تغير أم لا:

  • إذا كان صف التدقيق موجود (غير مقيم)، يمكنك معرفة ما إذا كان الصف في السؤال غير.
  • إذا لم تكن هناك صفوف التدقيق موجودة لهذا البند (تم تطهيرها) لم يتغير أي شيء (نظرا لأن أي تغيير يكتب إلى جدول التدقيق، بما في ذلك عناصر جديدة تماما)

إذا ذهبت مع Appraoch 1: وتطهير نطاق، فسيكون من الصعب (تحتاج إلى تذكر تاريخ التطهير) لإخبار إدراج جديدة مقابل تلك التي تم فيها تطهير جميع الصفوف.

نصائح أخرى

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

لذلك إذا كان لديك عمود "اسم" الخاص بك، فسيكون جدول التدقيق "اسم_ولد" و "name_new".

في إدراج الزناد، يتم تعيين "Name_old" إلى فارغ / NULL اعتمادا على تفضيلاتك ويتم تعيين "name_new" من إدراجها. في التحديث الزناد، يتم تعيين "Name_old" من المحذوفة و "name_new" من إدراجها في حذف الزناد، يتم تعيين "Name_old" من المحذوفة و "new_name" الفارغة / null.

(أو تستخدم انضمام كامل وتشغيل واحد لجميع الحالات)

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

أي إذا كان لديك حقل كمية في طاولتك الحقيقية وتحديثه من 5 إلى 7، فستكون لديك في جدول التدقيق:

quantity_old  quantity_new
           5             7

يمكنك بسهولة حساب أن الكمية قد زادت بنسبة 2 في الوقت المحدد.

إذا كان لديك صفوف منفصلة في جدول التدقيق، فسيتعين عليك الانضمام إلى صف واحد مع "التالي" لحساب الفرق - والتي يمكن أن تكون صعبة في بعض الحالات ...

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