在 Oracle 中删除模式中的所有内容

新手上路,请多包涵

是否可以删除Oracle中方案中的所有内容?我找到了这个脚本:

 Begin
    for c in (select table_name from user_tables) loop
    execute immediate ('drop table "'||c.table_name||'" cascade constraints');
    end loop;
End;
/

但我想知道是否有任何东西可以删除架构、索引、表、约束中的所有内容……但不是架构(删除用户……)。

谢谢。

原文由 zerosssa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 724
2 个回答

通常,删除和添加用户是最简单的。如果您具有对数据库的系统或 sysdba 访问权限,则这是首选方法。

如果您没有系统级别的访问权限,并且想要清理您的架构,则以下 sql 将生成一系列删除语句,然后可以执行这些语句。

 select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';'  from user_objects

然后,我通常会清理回收站以真正清理东西。老实说,我没有看到 oracle 的回收站有很多用处,我希望我可以禁用它,但无论如何:

 purge recyclebin;

这将生成一个 drop 语句列表。并非所有这些都会执行 - 如果您使用级联删除,删除 PK_* 索引将失败。但最终,您将拥有一个非常干净的架构。确认:

 select * from user_objects

另外,只是补充一下,您问题中的 Pl/sql 块将仅删除表,它不会删除所有其他对象。

ps:从某个网站复制的,对我有用。经过测试并像魅力一样工作。

原文由 venki 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 github 上找到以下开箱即用的脚本(SQL*Plus:版本 12.2.0.1.0 生产):

https://gist.github.com/rafaeleyng/33eaef673fc4ee98a6de4f70c8ce3657

感谢作者 Rafael Eyng。

只需登录到要删除其对象的架构。

 BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                     FROM user_objects
                    WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'TYPE',
                              'SYNONYM',
                              'MATERIALIZED VIEW'
                             ))
   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;
/

仍然可能有指向刚刚删除的表的 PUBLIC SYNONYMS。以下脚本也会删除这些:

 BEGIN
   FOR cur_syn IN (SELECT synonym_name
                     FROM all_synonyms
                    WHERE table_owner = 'MY_USER')
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'drop public synonym ' || cur_syn.synonym_name ;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.PUT_LINE ('Failed to drop the public synonym ' || cur_syn.synonym_name || '! ' || sqlerrm);
      END;
   END LOOP;
END;
/

原文由 Heri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进