2个相同的数据库建立在不同的服务器上,现在我想比较2个数据库中的表字段。例如:
表1在服务器1上,表2在服务器2上。
表1和表2的表名是相同的,都是dba01。
现在想比较他们的字段是否相同,只比较字段名就可以了。请问除了用手工比较外,有没有什么好的办法?谢谢!

解决方案 »

  1.   

    1  在服务器1上建立一个指向服务器2的database link,如dbl22  执行以下查询:
    select table_nanme,column_name from user_tab_columns
    where table_name='DBA01'
    minus
    select table_nanme,column_name from user_tab_columns
    where table_name='DBA01'@dbl2;
    即查出来的列,即为服务器1中表存在而服务器2表不存在的列。3  执行以下查询
    select table_nanme,column_name from user_tab_columns
    where table_name='DBA01'@dbl2;
    minus
    select table_nanme,column_name from user_tab_columns
    where table_name='DBA01'
    即查出来的列,即为服务器2中表存在而服务器1表不存在的列。
      

  2.   

    不好意思,应该是:
    select table_nanme,column_name from user_tab_columns 
    where table_name='DBA01' 
    minus
    select table_nanme,column_name from user_tab_columns@dbl2
    where table_name='DBA01'; select table_nanme,column_name from user_tab_columns@dbl2
    where table_name='DBA01'
    minus 
    select table_nanme,column_name from user_tab_columns 
    where table_name='DBA01';
      

  3.   

    pl/sql developer 
    Tools->Compare User Objects..
    可以比较当前数据库和指定的另一个数据库的对象差异,
    全方位比较,很全面!
      

  4.   

    恩,好了,非常感谢。
    还有一个问题,假如我想比较2个表的数据量呢?就是count(*)
      

  5.   

    这个不如手工比较啊。2数据库分别count(*)一目了然。你的意思是还要比较每条数据的差异?select * from dba01
    minus
    select * from dba01@dbl2;再
    select * from dba01@dbl2
    minus
    select * from dba01;?????这个貌似没什么必要吧?
      

  6.   

    一样的,去掉where。
    前提是你只需要比较列名,不管字段类型,字段长度,精度等等等………
    select table_nanme,column_name from user_tab_columns 
    minus 
    select table_nanme,column_name from user_tab_columns@dbl2; select table_nanme,column_name from user_tab_columns@dbl2 
    minus 
    select table_nanme,column_name from user_tab_columns;如果需要精确匹配,甚至像我们老板那样,连comment都要比对,个么完善该SQL,我本机没有装ORACLE。无法精确指出,大致有:data_type,data_length,还有刻度,精度,记不住。。