سؤال

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

والآن لدي جدول التبعيات إضافية. كل سجل في الجدول التبعية هو ملفين، موضحا أن الملف الأول يعتمد على الثانية. مرة أخرى هذه هي المفاتيح الخارجية، يتم تعيين أول من CASCADE (حتى لو كنت حذف إدخال ملف، يتم حذف هذا رقم قياسي)، ولكن يتم تعيين الثاني لتقييد (ما لم يسمح لي لحذف إدخال ملف إذا تعتمد أي ملفات أخرى عليه). مرة أخرى، كل شيء يبدو جيدا.

وأسف يبدو أنني لم تعد قادرة على حذف مشروع مع SQL احد حذف بيان! ويحاول الحذف لتتالي-حذف الملفات، ولكن إذا كان أي من هذه تظهر في الجدول DEPENDENCIES، وتقييد مفتاح خارجي يمنع حذف (على الرغم من أن سجل في الجدول تبعيات سيتم إزالتها لأن العمود الآخر هو CASCADE). الحل الوحيد لدي هو لحساب الترتيب الدقيق لحذف الملفات بحيث لا التبعية تنتهك قيود السجل، وإزالة السجلات ملف واحد في وقت واحد قبل محاولة إزالة المشروع.

هل هناك أي طريقة لإعداد مخطط قاعدة البيانات الخاصة بي لذلك SQL واحد حذف من الجدول المشاريع سوف تتالي حذف أخرى بشكل صحيح؟ أنا باستخدام فايربيرد 2.1، ولكن أنا لا أعرف إذا كان هذا يجعل أي فرق؟ - يبدو أن هناك يجب أن يكون وسيلة لجعل هذا العمل

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

المحلول

ولا يمكنك التحكم ترتيب الحذف من خلال مفتاح خارجي المتتالية، ولكن قد تكون قادرة على تصميم مشغل على PROJECTS لحذف الصفوف في FILES التي تنتمي إلى هذا المشروع، وترد أيضا في DEPENDENCIES كما تعتمد على FILES الآخر . جعله نقطة انطلاق BEFORE DELETE، لذلك يجب تنفيذ قبل الآثار المتتالية.

وشيء من هذا القبيل:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

وهكذا عندما قمت بحذف المشروع، وهذا حذف كافة الملفات "الطفل" من مشروع التي تعتمد على ملفات أخرى، وهذه الاجهزة حذف الصفوف في DEPENDENCIES حتى يتسنى لجميع الملفات المتبقية خالية من التبعيات. الحذف للمشروع يمكن الآن تتالي حذف هذه الملفات.

وأنا لم تختبر هذا وبناء بلدي فايربيرد قد يكون صدئ، ولكن ربما سوف تحصل على انك بدأته.

من الواضح، يرجى اختبار هذا على نسخة من البيانات الخاصة بك، وليس بيانات حية!

نصائح أخرى

هل القيود دعم نظام المؤجلة، الذي الاختيار القيد يمكن تأجيلها حتى نقطة ارتكاب؟

وربما هذا هو مجرد شيء أوراكل بالرغم من ذلك.

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