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語句。否則如果已經存在就不動