删除Oracle中架构中的所有内容

zer*_*ssa 23 sql oracle plsql

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

Begin
for c in (select table_name from user_tables) loop
execute immediate ('drop table '||c.table_name||' cascade constraints);
end loop;
End;
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有任何东西可以删除模式,索引,表格,约束中的所有内容......但不是模式(删除用户...).

谢谢.

ven*_*nki 37

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

如果您没有系统级访问权限,并且想要擦除模式,则以下sql将生成一系列drop语句,然后可以执行这些语句.

select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';'  from user_objects
Run Code Online (Sandbox Code Playgroud)

然后,我通常清洗回收站,以真正清理.说实话,我没有看到oracle的回收站有很多用途,并希望我可以禁用它,但无论如何:

purge recyclebin;
Run Code Online (Sandbox Code Playgroud)

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

select * from user_objects
Run Code Online (Sandbox Code Playgroud)

另外,只需添加,问题中的Pl/sql块将仅删除表,它不会删除所有其他对象.

ps:从某个网站复制,对我很有用.经过测试和工作就像一个魅力.


Her*_*eri 8

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

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;
/
Run Code Online (Sandbox Code Playgroud)

仍然可能有公共同义词指向刚刚删除的表。以下脚本也会删除这些内容:

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;
/
Run Code Online (Sandbox Code Playgroud)