故障現場
金融 ETL 作業報警:輸出階段字段定義 Decimal(9,6),目標數據庫表字段為 Number(11,8)。修改 Job 字段為 Decimal(11,8) 後,Schema 檢查報錯:ETL 環境中該表創建語句仍為 Number(9,6),導致元數據衝突。
根因分析
- 三處定義不一致: 源文件/Job 定義 → DataStage 內部 Schema → 目標數據庫 DDL。
- Schema 傳播機制: DataStage 導入表定義時生成內部 Schema,若後續手動修改 Job 字段而未同步更新 Schema,會觸發元數據校驗失敗。
- 精度縮水風險:
Number(9,6) 整數位僅 3 位,Number(11,8) 整數位亦 3 位但小數位更多,直接修改可能導致現有數據截斷或插入失敗。
標準化解決流程
- 以數據庫為準: 確認目標表真實 DDL(
DESC table_name),以此為唯一真實源。
- 同步更新 Schema: 在 DataStage Manager 中右鍵表定義 → Update from Database,拉取最新元數據覆蓋內部 Schema。
- 重新導入 Job: 刪除 Job 中舊的階段,拖入更新後的表定義,自動獲得正確字段長度。
- 關鍵屬性設置: 對於 Decimal/Number 類型,務必在列屬性中勾選 「可控」** 或 「Pad with Zeros(補零)」**,確保精度對齊不報警。
驗證清單
- ✅ Job 編譯無警告
- ✅ 運行日誌無
Truncation 或 Precision loss 提示
- ✅ 目標表數據抽樣核對,小數位完整保留
避坑指南
- 切勿直接手改 Job 字段屬性而不同步 Schema。
- 跨環境遷移時,優先導出/導入
.dsx 並執行 Update from Database。
- 金融級精度字段,建議在表定義階段統一使用
Decimal(38,18) 等高精度預留,避免後續頻繁變更。
元數據一致性是 ETL 穩定運行的基石,「可控/補零」選項是解決精度不匹配警告的關鍵開關。