我的產(chǎn)品是被要求運行在多種常見數(shù)據(jù)庫平臺下(mysql/sqlserver/oracle)下,在開發(fā)中需要嚴格遵循相關(guān)的規(guī)范以確保能夠?qū)崿F(xiàn)跨數(shù)據(jù)庫類型的要求.(相關(guān)的要點在我的"你的系統(tǒng)真的因為使用hibernate就可以適應(yīng)各種數(shù)據(jù)庫嗎? "一文中已提及).在初始開發(fā)時有一個問題是比較困擾我的團隊的,我們開發(fā)的時候必定是基于某個特定的數(shù)據(jù)庫開發(fā)的(比如mysql),但在測試階段是需要在不同的數(shù)據(jù)庫平臺下進行兼容性測試,由于開發(fā)過程中數(shù)據(jù)庫結(jié)構(gòu)與種子數(shù)據(jù)變化非常快,全部編寫sql方式非常浪費時間,如何能找到一種高效的數(shù)據(jù)庫相互遷移的工具,是我們當(dāng)時所急需的解決方案.
其實也沒啥選擇,比較常用的數(shù)據(jù)庫遷移工具就是Sqlserver自帶的DTS,這玩意在sql server數(shù)據(jù)庫間進行數(shù)據(jù)導(dǎo)入/導(dǎo)出時倒確實比較好用,在不同數(shù)據(jù)庫類型進行操作時,就會出多多問題,如:類型轉(zhuǎn)換需手工指定/導(dǎo)出字段有雙引號...
所以最后的選擇就是自己做一個DTS好啦,思路如下:
1、選擇源數(shù)據(jù)庫連接與目標(biāo)數(shù)據(jù)庫連接
2、根據(jù)源數(shù)據(jù)庫遍歷所有數(shù)據(jù)庫對象(表),做為基準
3、刪除目標(biāo)數(shù)據(jù)庫所有表外鍵及索引、刪除所有種字數(shù)據(jù)(根據(jù)約定)數(shù)據(jù)、字段均允許null
4、遍歷源數(shù)據(jù)庫中所有表,為目標(biāo)數(shù)據(jù)庫修改結(jié)構(gòu)(如增刪字段,字段改類型、大小)
5、將源數(shù)據(jù)庫中種子數(shù)據(jù)表數(shù)據(jù)拷貝至目標(biāo)數(shù)據(jù)庫中
6、根據(jù)源數(shù)據(jù)庫為目標(biāo)數(shù)據(jù)庫中的表創(chuàng)建外鍵及索引、設(shè)置是否允許為null
7、搞掂!
完工后總代碼量不過兩千行(因為需考慮不同數(shù)據(jù)庫的SQL Dialet,否則應(yīng)該更少)
用戶界面基于Eclipse RCP技術(shù)開發(fā),使用JFace Wizard向?qū)Вㄈ绻皇窍胗孟驅(qū)У脑挘憧梢杂肧WT來做)對話框獲得源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫的連接內(nèi)容,并在用戶點擊完成按鈕后,在進度條中提示用戶執(zhí)行情況.用了這個玩意以后,測試同事的數(shù)據(jù)庫兼容性測試就再也不用來煩我們開發(fā)組啦!真是爽呀!當(dāng)然很多喜歡折騰的客戶(比如突然在哪里聽說oracle是大型數(shù)據(jù)庫,非讓你幫他弄過去)此類朝三暮四也就自然不在話下啦!
![數(shù)據(jù)庫遷移向?qū)聊灰? src=]()
![數(shù)據(jù)庫遷移向?qū)聊欢? src=]()
![數(shù)據(jù)庫遷移向?qū)聊蝗? src=]()
本人原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!