سؤال

أقوم بتنفيذ CRUD على تطبيق Silverlight الخاص بي، ومع ذلك لا أرغب في تنفيذ وظيفة الحذف بالطريقة التقليدية، وبدلاً من ذلك أرغب في تعيين البيانات لتكون مخفية بدلاً من ذلك داخل قاعدة البيانات.

هل يعرف أحد طريقة للقيام بذلك باستخدام قاعدة بيانات SQL Server؟

مساعدة موضع تقدير كبير.

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

المحلول

لتوسيع فكرة Lukasz، يعد عمود التاريخ والوقت مفيدًا أيضًا.

  • NULL = الحالي
  • القيمة = عند الحذف الناعم

يضيف هذا إصدارًا بسيطًا لا يمكن لعمود البت أن يعمل بشكل أفضل

نصائح أخرى

ويمكنك إضافة عمود آخر إلى جدول "حذف" التي لديها قيمة 0 أو 1، وعرض تلك السجلات فقط مع حذف = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

ويمكنك أيضا إنشاء الرأي الذي يأخذ الصفوف فقط اعيد.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

وحذف القيادة من شأنها أن تبدو مثل هذا:

UPDATE TheTable SET deleted = 1 WHERE id = ...

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

هل يمكن أن تفعل كما يقترح لوكاس Lysik ، ويكون ل الحقول التي هي بمثابة إشارة للصفوف "حذف"، وتصفية بها عندما كنت لا تريد لهم تظهر. لقد استعملت أنه في عدد من التطبيقات.

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

* هذا هو اسم العرض لرمز رقمي المستخدمة وراء الكواليس. مجرد توضيح. :)

الحل مع المشغلات

إذا كنت صديقًا لـ DB Trigger، فقد تفكر في ما يلي:

  • أضف DeletedAt and DeletedBy الأعمدة إلى الجداول الخاصة بك
  • إنشاء طريقة عرض لكل جدول (على سبيل المثال:للجدول Customer عند CustomerView عرض، والذي من شأنه تصفية الصفوف التي تحتوي على DeletedAt ليست فارغة (فكرة gbn مع أعمدة التاريخ)
  • جميع عمليات CRUD الخاصة بك تعمل كالمعتاد، ولكن ليس على Customer الجدول، ولكن على CustomerView
  • يضيف INSTEAD OF DELETE المشغل الذي من شأنه وضع علامة على الصف كحذف بدلاً من حذفه فعليًا.
    • قد ترغب في القيام بأشياء أكثر تعقيدًا بعض الشيء هناك مثل التأكد من حذف جميع مراجع FK لهذا الصف أيضًا "بشكل منطقي" من أجل الاستمرار في الاحتفاظ بها منطقي التكامل المرجعي

إذا اخترت استخدام هذا النمط، فمن المحتمل أن أقوم بتسمية جداولي بشكل مختلف TCustomer, ووجهات النظر فقط Customer لوضوح رمز العميل.

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

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