قم بقمع أخطاء ORA-00942 في DDL إنشاء البرامج النصية
-
27-09-2019 - |
سؤال
لنفترض أنك تقوم بإنشاء DDL لإنشاء جميع جداول DB الخاصة بك وما إلى ذلك عبر مخطط Hibernate وما إلى ذلك. ليست مشكلة ، كما أريد هذا. لكن تشغيل هذا البرنامج النصي ينتج حمولة من أخطاء ORA-00942 التي تعمل على Oracle DB.
نظرًا لأنها ليست أخطاء حقًا إذا لم تكن الجداول موجودة بعد ، فأود أن يكون برنامج Create Crimp خاليًا من الأخطاء عند تنفيذه ، لذا فمن السهل تحديد ما فشل (إن وجد).
ما هي خياراتي؟ أريد أن يتم إنشاء عبارات إسقاط نظرًا لأن الجداول قد تكون موجودة أو غير موجودة بعد ، لكنني لا أريد مليون ORA-S تعود إليّ والتي يجب أن أتحقق منها (لتحديد ما إذا كانت أخطاء فعلية) لمجرد أنها لا يمكن أن تكون كذلك. T إسقاط طاولة جديدة.
المحلول
إذا حصلت على برنامج نصي من عبارات الإسقاط ، ولن تفعل السبات من أجلك ، ثم لف عبارات جدول الإسقاط في ما إذا كان لاختبار ما إذا كان الجدول موجودًا قبل إسقاطه:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
نصائح أخرى
"لنفترض أنك تنشئ DDL لإنشاء جميع جداول DB الخاصة بك وما إلى ذلك عبر مخطط Hibernate Export وما إلى ذلك. -00942 أخطاء تعمل على Oracle DB. "
من الناحية المثالية ، يجب أن نحافظ على مخططنا بشكل صحيح ، باستخدام أفضل ممارسات التحكم في المصدر وإدارة التكوين. في هذا السيناريو ، نعرف مسبقًا ما إذا كان المخطط الذي نديره نصوصنا ضد تلك الجداول. لا نحصل على أخطاء لأننا لا نحاول إسقاط الجداول التي لا توجد.
ومع ذلك ، ليس من الممكن دائمًا القيام بذلك. طريقة واحدة بديلة هي أن يكون لديك نصين. يحتوي البرنامج النصي الأول فقط على عبارات جدول الإسقاط ، مسبقًا مع ودية
PROMPT It is safe to ignore any ORA-00942 errors in the following statements
يحتوي البرنامج النصي الثاني على جميع عبارات جدول الإنشاء ويؤدي معها
PROMPT All the statements in this script should succeed. So investigate any errors
خيار آخر هو استخدام قاموس البيانات:
begin
for r in ( select table_name from user_tables )
loop
execute immediate 'drop table '||r.table_name
||' cascade constraints';
end loop;
end;
كن حذرا مع هذا. إنه الخيار النووي وسيسقط كل جدول في مخططك.