【问题标题】:Wipe data from Oracle DB从 Oracle DB 中擦除数据
【发布时间】:2009-11-10 23:48:39
【问题描述】:

我正在运行一些测试以将数据从一个数据库迁移到另一个数据库,为此我需要删除并重新创建相同的表、视图和其他内容。那么什么是 Oracle 中用于擦除所有内容(删除表、视图、序列、函数、过程等)的 SQL 语句。我知道我可以使用“DROP”,但有时这还不够方便。

谢谢

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    最简单的方法是删除对象关联的架构:

    DROP USER [schema name] CASCADE
    

    从轨道上对其进行核打击 - 这是唯一确定的方法;)

    对于您提供的脚本,您可以改为运行这些查询,而无需使用以下匿名过程生成中间脚本:

    BEGIN
    
      --Bye Views!
      FOR i IN (SELECT uv.view_name
                  FROM USER_VIEWS uv) LOOP
        EXECUTE IMMEDIATE 'drop view '|| i.view_name ||'';
      END LOOP;
    
      --Bye Sequences!
      FOR i IN (SELECT us.sequence_name
                  FROM USER_SEQUENCES us) LOOP
        EXECUTE IMMEDIATE 'drop sequence '|| i.sequence_name ||'';
      END LOOP;
    
      --Bye Tables!
      FOR i IN (SELECT ut.table_name
                  FROM USER_TABLES ut) LOOP
        EXECUTE IMMEDIATE 'drop table '|| i.table_name ||' CASCADE CONSTRAINTS ';
      END LOOP;
    
      --Bye Procedures/Functions/Packages!
      FOR i IN (SELECT us.name,
                       us.type
                  FROM USER_SOURCE us
                 WHERE us.type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE')
              GROUP BY us.name, us.type) LOOP
        EXECUTE IMMEDIATE 'drop '|| i.type ||' '|| i.name ||'';
      END LOOP;
    
      --Bye Synonyms!
      FOR i IN (SELECT ut.synonym_name
                  FROM USER_SYNONYMS us
                 WHERE us.synonym_name NOT LIKE 'sta%' 
                   AND us.synonym_name LIKE 's_%') LOOP
        EXECUTE IMMEDIATE 'drop synonym '|| i.synonym_name ||'';
      END LOOP;
    
    END;
    

    【讨论】:

    • 再见 proce/func/package 部分将不起作用,因为 (1) NAME 不是唯一的并且 (2) 类型应该是大写的。如果有 FK 约束,我也不确定表。
    • 以这种方式强制删除表时,最好将 CASCADE CONSTRAINTS 子句附加到生成的 DROP TABLE 语句中。否则,该语句可能会因 ORA-02449 而失败。
    【解决方案2】:

    在我不能简单地删除架构的情况下,我使用以下脚本:

    DECLARE
    CURSOR c_get_objects IS
      SELECT object_type, '"' || object_name || '"' || DECODE(object_type, 'TABLE', ' cascade constraints', NULL) obj_name
        FROM user_objects
       WHERE object_type IN ('TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'SYNONYM', 'MATERIALIZED VIEW')
       ORDER BY object_type;
    CURSOR c_get_objects_type IS
      SELECT object_type, '"' || object_name || '"' obj_name FROM user_objects WHERE object_type IN ('TYPE');
    BEGIN
    FOR object_rec IN c_get_objects
    LOOP
      EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name);
    END LOOP;
    FOR object_rec IN c_get_objects_type
    LOOP
      EXECUTE IMMEDIATE ('drop ' || object_rec.object_type || ' ' || object_rec.obj_name || ' force');
    END LOOP;
    END;
    /
    

    【讨论】:

      【解决方案3】:

      我有found this script,您可以在其中生成脚本来删除所有内容,但如果我使用通用的东西会很棒。

      set feedback off
      set pagesize 0
      spool AllObjectsDrop.sql
      select 'drop view '||view_name||';' from user_views;
      select distinct 'drop sequence '||sequence_name|| ';'from user_sequences;
      select distinct 'drop table '||table_name|| ';'from user_tables;
      select distinct 'drop procedure '||name|| ';'from user_source where type = 'procedure';
      select distinct 'drop function '||name|| ';'from user_source where type = 'function';
      select distinct 'drop package '||name|| ';'from user_source where type = 'package';
      select 'drop synonym '||synonym_name||';' from user_synonyms where synonym_name not like 'sta%' and synonym_name like 's_%'
      spool off
      

      【讨论】:

      • 如果您还没有,请根据反馈检查我的答案的更新。
      【解决方案4】:

      如果您有企业版,您应该查看restore points and Flashback Database

      DROP USER ... 如果您有权限和快速脚本来重新创建用户,那么 CASCADE 是很好的选择。

      【讨论】:

        【解决方案5】:

        我以前也遇到过这种情况,我所做的是恢复备份并覆盖当前架构。

        这样我就可以让一切回到原点。

        【讨论】:

          猜你喜欢
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 2015-11-19
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          相关资源
          最近更新 更多