استعلام للحصول على كافة المراجعات للرسم البياني للكائن
-
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