تضارب CASCADE وتقييد المتطلبات الرئيسية الخارجية؟
-
20-08-2019 - |
سؤال
وأنا أعمل على قاعدة بيانات لتتبع الملفات والتبعيات في المشاريع. باختصار، لقد اثنين من الجداول الرئيسية؛ قوائم المشاريع الجدول أسماء وغيرها من الممتلكات المشروع، يسرد الجدول 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
حتى يتسنى لجميع الملفات المتبقية خالية من التبعيات. الحذف للمشروع يمكن الآن تتالي حذف هذه الملفات.
وأنا لم تختبر هذا وبناء بلدي فايربيرد قد يكون صدئ، ولكن ربما سوف تحصل على انك بدأته.
من الواضح، يرجى اختبار هذا على نسخة من البيانات الخاصة بك، وليس بيانات حية!
نصائح أخرى
هل القيود دعم نظام المؤجلة، الذي الاختيار القيد يمكن تأجيلها حتى نقطة ارتكاب؟
وربما هذا هو مجرد شيء أوراكل بالرغم من ذلك.