在大型專案中,存儲程序佔據核心業務邏輯,且採三個月一釋出的迭代週期。每個版本需經歷單元測試、功能驗證測試(FVT)、用戶接受測試(UAT)三階段,對應不同資料庫環境(fvtdb、uatdb、proddb 等)。與 J2EE 應用只需部署 EAR 檔不同,存儲程序部署必須「只更新已修改的物件」,如何在眾多資料庫間精準、快速同步變更,成為關鍵挑戰。
為回應敏捷開發「快速應對變化」的核心需求,團隊開發了 mydbtool —— 以 Bash Shell 腳本編寫,透過 Cygwin 在 Windows 上模擬 Linux/Unix 環境,實現跨平台運行。它整合 DB2 常用指令與 sed、awk 等文字處理工具,提供資料庫開發、調優、部署、比對的完整工具鏈,顯著提升效率與準確度。
conn [dbname]:智慧連線,記錄用戶名/密碼,避免重複輸入導致帳號鎖定。listconn 列出所有已記錄連線(儲存於 ${HOME}/mydbtool.profile)。
| 指令 | 功能 | 範例 |
|---|---|---|
view [spname] | 檢視存儲程序/UDF 原始碼 | mydbtool -d duke view ebiz1.i_qt_quote |
table [tablename] | 顯示表定義(欄位、PK、FK、索引) | mydbtool -d duke table ebiz1.web_quote |
dep [tablename] | 列出依賴該表的所有資料庫物件 | mydbtool -d duke dep ebiz1.web_quote |
column [schema.table.column] | 精準分析特定欄位的相依物件 | mydbtool -d duke column mis.order.order_type |
check [spname] | 提取註解中的 Sample Call 執行測試 | mydbtool -d duke check ebiz1.i_qt_quote |
e [SQL檔/語句]:執行 SQL,自動記錄耗時與結果至日誌。rebindall / rebindsp [spname]:重新綁定失效存儲程序或指定程序(如建立索引後)。exp [SQL檔] / expsp [spname]:產生文字格式執行計劃,識別 Table Scan 等效能熱點。| 指令 | 用途 | 參數 |
|---|---|---|
diffsp | 比對兩庫間存儲程序/UDF 差異 | 源庫、目標庫、程式清單檔 |
difftab | 比對表/視圖/索引/權限差異 | 源庫、目標庫、表清單檔 |
diffdb | 綜合比對(SP、UDF、表、索引、權限),自動掃描源碼目錄下指定時間後修改的檔案生成清單 | 源庫、目標庫、專案路徑、日期 |
實戰流程:開發庫 webduke 完成 v2.0 修改後,執行 mydbtool diffdb duke rod ~/v1.0/orderSQL 200907010000,自動產生部署清單 cr_list.txt 與部署腳本 cr_report.txt(重命名為 cr_rod.sh 加上連線指令後直接執行),隨後用 check 驗證部署結果。此流程貫穿 FVT→UAT→Production 各環境,極大減少人工錯誤與工作量。
腳本化將重複性操作封裝為可重用資產,配合 DB2 系統表與指令列工具,構建出高效、可追蹤的資料庫開發流水線。mydbtool 證明了「腳本是資料庫開發的利器」,值得團隊根據自身場景持續演進。