سؤال

كيف يمكنني إسقاط جميع جداول المستخدمين في أوراكل؟

لدي مشكلة مع القيود. عندما تعطيل كل ما لا يزال غير ممكن.

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

المحلول

BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                     FROM user_objects
                    WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   LOOP
      BEGIN
         IF cur_rec.object_type = 'TABLE'
         THEN
            EXECUTE IMMEDIATE    'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '" CASCADE CONSTRAINTS';
         ELSE
            EXECUTE IMMEDIATE    'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"';
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (   'FAILED: DROP '
                                  || cur_rec.object_type
                                  || ' "'
                                  || cur_rec.object_name
                                  || '"'
                                 );
      END;
   END LOOP;
END;
/

نصائح أخرى

إذا كنت تريد فقط طريقة بسيطة حقا للقيام بذلك .. هيريس نصي استخدمته في الماضي

select 'drop table '||table_name||' cascade constraints;' from user_tables;

سيؤدي ذلك إلى طباعة سلسلة من أوامر إسقاط لجميع الجداول في المخطط. التخزين المؤقت نتيجة هذا الاستعلام وتنفيذه.

مصدر: https://forums.oracle.com/forums/thread.jspa؟threadid=614090.

وبالمثل إذا كنت ترغب في مسح أكثر من الجداول، يمكنك تعديل ما يلي لتناسب احتياجاتك

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

إجابة أخرى تعمل بالنسبة لي هي (الائتمان ل http://snipt.net/fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/)

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

لاحظ أن هذا يعمل فورا بعد تشغيله. نعم هو كذلك ليس إنتاج برنامج نصي تحتاج إلى لصق مكان ما (مثل الإجابات الأخرى هنا). يعمل مباشرة على DB.

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

أبسط طريقة هي إسقاط المستخدم الذي يمتلك الكائنات مع أمر Cascade.

DROP USER username CASCADE

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

SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables هو جدول النظام الذي يحتوي على جميع جداول المستخدم، سيقوم جملة المختطف بإنشاء عبارة إسقاط لكل جدول يمكنك تشغيل البرنامج النصي

لإزالة جميع الكائنات في Oracle:

1) ديناميكية

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' '||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' '||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' '||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) ثابت

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top