我有数据库中一批表的建表语句现在在数据库中,这些表被人修改过,有的比原来少了一些字段,有的多了一些字段,有的在某些字段类型上发生了变化。有没有办法根据快速地将这些表还原成create语句指定的表结构(字段多了就删字段,少了就加字段)但这些表已经有数据了,修改表结构时要保留这些数据
如果做不到批量处理,那只有一个表的情况下怎么快速处理?(我现在是人工处理,用desc的结果和create语句逐个字段比对并写出对应的alter语句,希望找到更好方法)

解决方案 »

  1.   

    不知道有什么方法应该不行吧。。除非你在建库的时候,在create那时对数据库进行全库备份了。。
      

  2.   

    有源库吗,,2个库自动做比较用户对象会把差异SQL自动贴出来的。
      

  3.   

    非完整解决方案,仅供参考!前提:
    1、数据库版本大于等于10g(主要是用到wmsys.wm_concat)
    2、修改后的数据表(新表)的字段精度不能超过原来(旧表)的精度(如果发现有这种情况可以个别处理,在插入时会报错)
    3、新表没有被drop掉,如果有drop掉的自行排除
    4、新表如有删除的字段,则原字段不能有NULL约束步骤:
    1、建立X用户(X,Y用户可以完全互相访问和操作任何表
    2、利用原来的建表语句在X用户下建立原来所有的表(楼主提到的“我有数据库中一批表的建表语句”)
    3、将Y用户下的表数据导入到X用户下
    SELECT 'insert into X.'||  a.TABLE_NAME ||' ('||wmsys.wm_concat(a.COLUMN_NAME)|| ')' || ' select '|| replace(wmsys.wm_concat(NVL(b.COLUMN_NAME,'@')),'@','NULL')||' from Y.'||a.TABLE_NAME
    FROM all_tab_cols a ,all_tab_cols b
    WHERE  a.TABLE_NAME=b.TABLE_NAME(+)
    AND   a.owner='X'
    AND   b.owner(+)='Y'
    AND   a.COLUMN_NAME=b.COLUMN_NAME(+)
    GROUP BY  a.TABLE_NAME
    4、删除Y用户下需调整的表
    SELECT 'drop table Y.'||table_name||';' FROM All_Tables WHERE owner='X';
    5、重建并导入Y用户需调整的表
    SELECT 'create table Y.'||table_name||' as select * from X.'||table_name||';' FROM All_Tables WHERE owner='X';
    6、删除X
    drop user X;
      

  4.   

    用create table tb as select(你需要的列,该转化的转化) from table_name
    然后再drop原表
      

  5.   

    alter table   add( );不理报错,应该可以吧。