كيفية إسقاط جميع المشغلات في قاعدة بيانات Firebird 1.5

StackOverflow https://stackoverflow.com/questions/3599185

سؤال

لأغراض التصحيح ، أحتاج إلى إرسال جدول واحد من قاعدة بيانات 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 من اختيارك لذلك.

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