كيفية إسقاط جميع المشغلات في قاعدة بيانات Firebird 1.5
-
02-10-2019 - |
سؤال
لأغراض التصحيح ، أحتاج إلى إرسال جدول واحد من قاعدة بيانات Firebird 1.5 الحالية إلى شخص ما.
في وضع إرسال DB بأكمله ، أريد إرسال ديسيبل فقط مع هذا الجدول فقط - لا توجد مشغلات ، ولا قيود. لا يمكنني نسخ البيانات إلى ديسيبل آخر لأنه فقط أننا نريد التحقق - لماذا يعطى هذا الجدول واحد مشاكل.
أنا فقط أتساءل عما إذا كانت هناك طريقة لإسقاط جميع المشغلات ، وجميع القيود وجميعهم باستثناء جدول واحد (باستخدام بعض الخدعة الذكية مع جداول النظام أو نحو ذلك)؟
المحلول
استخدام أداة واجهة المستخدم الرسومية (أنا شخصياً أفضل ibexpert) تنفيذ الأمر التالي:
select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null)
نسخ النتيجة إلى الحافظة ثم لصق وتنفيذ داخل النافذة التنفيذية البرنامج النصي.
نصائح أخرى
إذا تمكنت النسخ الاحتياطي لقاعدة البيانات الخاصة بك إلى Firebird 2.1 ، فهناك بعض التبديل في GBAK و ISQL.
تم تزويد بعض أدوات سطر أوامر Firebird بمفاتيح جديدة لقمع إطلاق البيانات التلقائي لمشغلات قاعدة البيانات:
gbak -nodbtriggers isql -nodbtriggers nbackup -T
لا يمكن استخدام هذه المفاتيح إلا من قبل مالك قاعدة البيانات و SYSDBA.
يمكنك إسقاط جميع المشغلات عن طريق حذفها مباشرة من جدول النظام ، مثل ذلك:
delete from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null);
لاحظ أن الطريقة العادية لاستخدام drop trigger
من الأفضل بالتأكيد ، ولكن يمكن القيام به.
يمكنك أيضًا إسقاط القيود من خلال تنفيذ بيانات DDL ، ولكن لتعداد القيود وإسقاطها في نص SQL ستحتاج إلى execute block
الوظيفة التي لا تحتوي عليها Firebird 1.5.
هناك عبارات مماثلة لحذف كائنات قاعدة البيانات الأخرى ، ولكن في الواقع قد يكون تشغيلها بنجاح أكثر صعوبة بسبب التبعيات بين الكائنات. لا يمكنك إسقاط أي كائن طالما يعتمد كائن آخر عليه. يمكن أن يصبح هذا أمرًا صعبًا حقًا بسبب المراجع الدائرية ، حيث يعتمد كائنان (أو أكثر) على بعضهما البعض ، ويشكلون دورة ، لذلك لا يوجد واحد قد يتم إسقاطه أولاً.
الطريق حول هذا هو كسر واحدة من التبعيات. يمكن تغيير إجراء على سبيل المثال التبعيات على كائنات أخرى للحصول على جسم فارغ ، وبعد ذلك لم يعد يعتمد على تلك الكائنات الأخرى ، لذلك قد يتم إسقاطها بعد ذلك. إسقاط المفاتيح الأجنبية هو وسيلة أخرى للتخلص من التبعيات بين الجداول.
لا أعرف أي أداة تنفذ مثل هذا الحذف الجزئي لكائنات قاعدة البيانات ، فإن حالة الاستخدام الخاصة بك هي IMO بعيدة عن الشائع. ومع ذلك ، يمكنك إلقاء نظرة على رمز المصدر Flamerobin التي لديها قدر معين من اكتشاف التبعية في الكود المستخدم لإنشاء البرامج النصية DDL أو عبارات التعديل لكائنات قاعدة البيانات. مسلحًا بهذه المعلومات ، يمكنك كتابة أداتك الخاصة للقيام بذلك.
إذا كان شيئًا لمرة واحدة قد يكون كافياً للقيام بذلك يدويًا. استخدم أي أداة لإدارة Firebird من اختيارك لذلك.