2009-11-10 74 views
3

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

感谢

回答

3

最简单的方法是删除模式的对象都关联到:

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; 
+1

Bye proce/func/package部分将不起作用,因为(1)NAME不是唯一的,(2)类型应该是大写。如果有FK限制,我也不确定表格。 – jva 2009-11-11 09:27:45

+0

以这种方式强制删除表时,最好将CASCADE CONSTRAINTS子句放入生成的DROP TABLE语句中。否则,该声明可能会失败,ORA-02449。 – APC 2009-11-11 09:40:29

+0

根据反馈进行更新。 – 2009-11-11 16:53:58

0

我一直在方案之前,我做的是恢复备份和覆盖当前的架构。

这样我就可以回到原点了。

1

我已经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 
+1

如果您还没有,请根据反馈检查我的答案的更新。 – 2009-11-11 17:15:14

+0

感谢您的帮助! – Maksim 2009-11-11 19:09:21

6

在不能简单地拖放模式,我使用以下脚本:

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; 
/