清空用户下所有表的数据及约束!
数据库版本:ORACLE 10.2.0.4   有两个数据库,库A,库B,两库的结构一样,
  
   库A的数据在不断更新,库B的数据不动,其它的数据库对象不变。  现要将库B中的表数据清空,但存储过程、触发器、包、包体不动,重新将库A的数据灌入库B。  现在碰到的第一个问题是:怎么清空用户下所有表的数据及约束,而存储过程、触发器、包、包体不动?  清空后库B的数据后,imp时,不使用“tables”选项(注:一个用户下有上千张表,如果将表名写到此选项中,会死人的,也不现实),
又要怎么操作,才能只将表的数据导入,而不覆盖存储过程、触发器、包、包体,注:数据库里有15个数据库用户。   附:我知道“drop user username cascade”可以清空用户下所有对象,然后再以用户模式,将被drop掉的用户的数据重imp,但这样作的话,存储过程、触发器、包、包体都被覆盖,现有我只想替换表中的数据,而其它的保持不变。哪位兄弟帮忙解释一下,谢谢!

解决方案 »

  1.   

    如果触发器要求不动,那么表就不能删除,否则触发器也没了。那么就只能是删数据,为了不触发触发器,就只能truncate.select 'truncate table '||table_name from user_tables;
    可得到一堆truncate语句,在A中执行即可清除某个用户下所有表的数据;至于导入数据,看数据量大不大,不大的话都导出为insert语句也可以。大的话还是用dmp,可以用windows的工具,如pl/sql developer, 因为这样导出选表很容易,有上千张表也不怕,全选即可。想不出什么好办法,供参考。
      

  2.   

    1.包、包体不管就行。触发器disable就行。
    如果表间数据有约束,就先disable约束,再删除数据,或直接drop约束,再truncate数据2.导入时只是导所有表,那么你在exp时选择加部分参数:
    constraints=n --不导出约束
    triggers=n --不导出触发器
    对于包和存储过程不好处理。不过你用的是10g,则推荐用expdp和impdp:
    加参数:exclude=procedure,package,trigger --导出时排除包和过程、触发器
      

  3.   

    drop user username cascade;
      

  4.   

    drop user username cascade;
      

  5.   

    你可以把库B的相应程序也COPY下来。。然后把库A的所有用户资料导成dmp文件,再进行导入到库B,然后再还原你已经备份好的程序代码。。
      

  6.   

    /*导入之前执行该部分,清理数据,禁用触发器、约束
    set trimspool on
    set pagesize 0
    spool c:\dis_all.sqlselect 'alter table ' || table_name || ' disable all triggers;' from user_tables;--先禁用外键,才能禁用相应的主键或唯一键。
    select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints where constraint_type = 'R';select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints where constraint_type != 'R';select 'truncate table '|| table_name || ';' from user_tables;
    spool off@c:\dis_all.sql*//* 导入之后执行以下部分,恢复触发器和约束。set trimspool on
    set pagesize 0
    spool c:\ena_all.sqlselect 'alter table ' || table_name || ' enable all triggers;' from user_tables;--先启用主键或唯一键,才能启用外键
    select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints where constraint_type != 'R';select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints where constraint_type ='R';spool off@c:\ena_all.sql*/
      

  7.   

    imp时指定 ignore=y 参数,可以忽略表已存在的创建错误,向表中追加数据。
      

  8.   

    最簡單的一個辦法就是刪掉數據庫A,再將數據庫B的所有內容導入到數據庫A中