oracle 比较两个用户下表结构差异

oracle11g,现有2个用户a和b,想要比较两个用户下表结构的差异

 

1.确保这两个用户都能访问元数据表:user_tab_columns

2.如果以a登陆,在a下创建DBLINK,以访问b用户的元数据表user_tab_columns(Oracle里面,视图SYS.USER_TAB_COLS和SYS.USER_TAB_COLUMNS都保存了当前用户的表、视图和Clusters中的列信息。通过检索这两个表,可以方便的获取到表的结构。)

创建语句:

create public database link  linkB connect to linkBusername identified by linkBpasswd
   using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =jk1)
))';

linkB为dblink名称 ,linkBusername用户名  linkBpasswd密码

3.执行sql

select * from (
select t1.TABLE_NAME,t1.COLUMN_NAME,t1.DATA_TYPE from user_tab_columns t1 where not exists(
select 1 from (user_tab_columns@linkB) t2 where t1.TABLE_NAME=t2.TABLE_NAME
and t1.DATA_TYPE=t2.DATA_TYPE and t1.COLUMN_NAME=t2.COLUMN_NAME
)) t ;

也可以选取需要的几个字段进行查询。进行order by

 

可以利用Oracle的这个特性,做数据库的升级维护工作。
比如我们要重构一张表,增加xx字段。普通的DDL语句一般都这么写没问题:

Sql
alter table A add (xx varchar2(255)) ;
然后如果我们做的好一点,还要求这个升级脚本是可以重复执行的。那怎么办呢?
可以写一个sql,逻辑是先到user_tab_columns去查询这张表是否有xx字段,如果没有,就执行上面这句sql语句。否则如果已经存在就不动

posted @ 2020-06-04 14:50  twokittens  阅读(1170)  评论(0编辑  收藏  举报