这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。 我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...

关于数据库对象版本比较的脚本

上一篇 / 下一篇  2008-02-19 20:59:21 / 个人分类:数据库专区

项目原因导致出现两个开发环境,主数据库环境因需求变更每天都需要进行脚本的修改,而报表服务器的脚本也需要同步更新,需求变更很少会同步提醒的;人工判断太过于麻烦,我又是一个懒人;只好写个脚本自动进行识别并加以运行了。

这只是一个简单的版本比较工具,事实上变更是很难判断的,例如表中新增了一个字段,导致顺序发生变更,这个时候你很难判断是新增还是修改的;诸如字段类型的修改.因此只能去判断表是否存在,字段是否存在,进而执行判断脚本,产生相应的表脚本和字段教本。

事实上Oracle有个DBMS_METADATA数据包提供了DLL脚本,不过包含了很多存储参数,对版本比较和对象生成没有什么意义。

ITPUB个人空间/](yU)yi_4F

--CREATE THE CREATE_TABLE SCRIPT, THOUGH WE CAN USE

--LIKE select dbms_metadata.get_ddl('TABLE','TABLENAME','USERNAME') from dual; GET THE SQL SCRIPT

--BUT IT IS NOT HELPFUL TO COMPARE THE DIFFERENT VERSION

SELECT SQLTEXT FROM
SXW S(J,yu4}0(
+Z,aSm.L/P2b$dA0SELECT 'CREATE TABLE '||TABLE_NAME AS SQLTEXT,-1 AS COLUMN_ID,TABLE_NAME FROMUSER_TABLES@REMOTEKGK
0~`A;cH&\0UNIONITPUB个人空间,x0g;E^f`r
SELECT '(' AS SQLTEXT,0 AS COLUMN_ID,TABLE_NAME FROMUSER_TABLES@REMOTEKGKITPUB个人空间&`b!T)}%C3Q-GS
UNION
/Yac)fZl I0SELECT ');' AS SQLTEXT,100 AS COLUMN_ID,TABLE_NAME FROMUSER_TABLES@REMOTEKGKITPUB个人空间]JuOVW
UNION
g jV3\'xW^+`0SELECTITPUB个人空间)q;lZ)K"].|k FF
CASE WHEN DATA_TYPE='NUMBER'ITPUB个人空间^:| H:j&shu0F
THENITPUB个人空间eY^MhX
CASE WHEN DATA_PRECISION IS NULLITPUB个人空间!T ?9i4?.]'X#l K
THEN COLUMN_NAME||' INTEGER,'ITPUB个人空间 V;WdI,@`1{
ELSE COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_PRECISION)||','||TO_CHAR(DATA_SCALE)||')'||DECODE(COLUMN_ID,(SELECT MAX

(B.COLUMN_ID) FROMUSER_TAB_COLUMNS@REMOTEKGKB WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
b)K;^W({!O8^0ENDITPUB个人空间^6h L5Q7G7T
WHEN DATA_TYPE='NVARCHAR2'
e8F0R'\\ MX0THEN COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_LENGTH/2)||')'||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROM

USER_TAB_COLUMNS@REMOTEKGKB WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
f1j9~;PW:MG0WHEN DATA_TYPE IN ('CHAR','VARCHAR2')
;K0j `P*{3lD0THEN COLUMN_NAME||' '||DATA_TYPE||'('||TO_CHAR(DATA_LENGTH)||')'||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROM

USER_TAB_COLUMNS@REMOTEKGKB WHERE A.TABLE_NAME=B.TABLE_NAME),' ',',')
pz3Y'^hfa k(s0Qc0WHEN DATA_TYPE IN ('DATE','BLOB','CLOB','LONG','NCLOB')
Cp4^Fd Gt0THEN COLUMN_NAME||' '||DATA_TYPE||DECODE(COLUMN_ID,(SELECT MAX(B.COLUMN_ID) FROMUSER_TAB_COLUMNS@REMOTEKGKB WHERE

A.TABLE_NAME=B.TABLE_NAME),' ',',')ITPUB个人空间,k4t6s[8r;f"o
END AS SQLTEXT,ITPUB个人空间4B yP F)^U q[$\ \
COLUMN_ID,
uP8K9r1d b8g,@Ni5m0A.TABLE_NAME
R ~:[;x9W BI0FROMUSER_TAB_COLUMNS@REMOTEKGKA
"uCD5v's#L!p0Where A.table_name Like 'T%'ITPUB个人空间WI-CCcV
) dITPUB个人空间$AGk:i+s t Lw W:t
Where d.table_name Not In
a/_E u4@ n0(
4S*FMU,J?0Select c.table_name From USER_TABLES cITPUB个人空间(nA6X-N Y8xVa
Where c.table_name Like 'T%'
IO_*s+y_,fvE0)
)_*UV]w`T,aW0ORDER BY TABLE_NAME,COLUMN_ID,SQLTEXT

--ADD NEW COLUMN ACCORDING THE LATEST TABLE NAME

SELECT 'ALTER TABLE '||TABLE_NAME||' ADD "'||COLUMN_NAME||'" '||ITPUB个人空间:C'D cc#^2p
(CASE WHEN DATA_TYPE='NUMBER'
S3ppAV0THENITPUB个人空间 z5e h i:zg r
CASE WHEN DATA_PRECISION IS NULLITPUB个人空间DIt C8gu?
THEN 'INTEGER'ITPUB个人空间5t*j/~*?D
ELSE DATA_TYPE||'('||TO_CHAR(DATA_PRECISION)||','||TO_CHAR(DATA_SCALE)||')'ITPUB个人空间9CO3M/o)g1yBT
END
tKG-J:g0WHEN DATA_TYPE='NVARCHAR2'ITPUB个人空间!jhM Y _.@-aZ
THEN DATA_TYPE||'('||TO_CHAR(DATA_LENGTH/2)||')'ITPUB个人空间d Tz7s&m4]%b
WHEN DATA_TYPE IN ('CHAR','VARCHAR2')
;F#Kd!G0F3_k0THEN DATA_TYPE||'('||TO_CHAR(DATA_LENGTH)||')'ITPUB个人空间RL+d/p J2\ n%P6L
WHEN DATA_TYPE IN ('DATE','BLOB','CLOB','LONG','NCLOB')ITPUB个人空间T he4C+L5d'bD
THEN DATA_TYPEITPUB个人空间R'a#l DSU*f4~b
END)||' ;' SQLTEXTITPUB个人空间@K-N[8j"[
FROMUSER_TAB_COLUMNS@REMOTEKGKA
o5mRd WDC4i%tC0Where (a.table_name,a.column_name) Not InITPUB个人空间W4F[z5\1[
(
|fA-C'XV5d0Select b.table_name,b.column_name From USER_TAB_COLS bITPUB个人空间o!I-nd @[
Where b.table_name Like 'T%'ITPUB个人空间 m8^8{EoU6~
)
G@D Vy:t0And A.table_name Like 'T%'
$Ee},YpG ^+v9RMN0ORDER BY COLUMN_ID

--BASED THE COLUMN_NAME AND COLUMN_ID,NEED TO MODIFY THE COLUMN NAME

--BUT IN FACT MOST SITUATION IT RESULT IN NEW COLUMN,SO IT IS NO USEFUL

....


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 25145
  • 日志数: 66
  • 建立时间: 2007-12-07
  • 更新时间: 2008-09-28

RSS订阅

Open Toolbar