說明

為了解決兩個資料庫在互轉時可以更靈活而開發的 Library ,雖然市面上早就有很多 DB Management Tool 就有支援,但是不知道可不可以符合我想要的需求,所以就寫了一個包含以下功能的 Library

  1. 標準化的轉資料函式,透過 INI 設定檔可互轉
  2. 可以支援 Oracle,MSSQL 互轉(可擴充)
  3. 可以支援互轉中途 Plug In 處理其它事
  4. 支援時區設定
  5. 失敗可以支援重傳(三次)
  6. 可支援下列四種型態互轉
    • 批次
    • 同步
    • 復製
    • 更新

Development

架構

整個 Library 分三個部份

  1. MigrateDataLib(主體)
  2. MigrateDataModel(介接PlugIn的Interface)
  3. PlugInProject(PlugIn所開發的專案)

Class Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/Class Diagram.png)

程式的進入點為 MigrateData - DoTask 其 Activity Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/DoTast Activity Diagram.png)

每種 Task 的 DoMigrate Activity Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/DoMigrate Activity Diagram.png)

基本設定

  • 基本

    1
    2
    3
    4
    5
    [Migrate Setting]
    '時區[Default:0]
    timeZone=
    'dll放置的資料夾[Default:Empty]
    folder=
  • 來源資料庫

    1
    2
    3
    4
    5
    [Source Database]
    '資料庫類型[Contain:SqlServer][Default:SqlServer]
    type=
    '連線字串,啟動後加密[Default:Empty]
    connectionString=
  • 目標資料庫

    1
    2
    3
    4
    5
    [Target Database]
    '資料庫類型[Contain:SqlServer][Default:SqlServer]
    type=
    '連線字串,啟動後加密[Default:Empty]
    connectionString=
  • Log

    1
    2
    3
    4
    5
    6
    7
    [Log Setting]
    '每次log的最大字元數(byte)[Default:200]
    retentionDay=
    '過期刪除的天數[Default:30]
    maxLogSize=
    '存放路徑[Default:.\LogFiles]
    path=

批次轉檔

依照所設定的標記欄位依序往後轉檔,流程如下所示

設定說明如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* : 一定要設定
- : 不一定要設定
' : 不用設定

[Migrate Task Batch]
* taskType=Batch
* sourceTable=來源表名
* targetTable=目標表名
* checkField=確認目前轉到那的標記欄位
- checkType=確認標記欄位的型態(如果是日期就不用輸入)
- checkBeginValue=確認標記欄位的起始值(沒有起始的話就不用設)
- checkEqual=比對時是否要等於前次最後的值(大於的話就不用設)
' syncField=(不用設定)
- condition=來源表是否需要條件設定(沒有的話就不用設)
- extraField=來源表是否需要額外欄位(沒有的話就不用設)
- plugIn=是否需要額外處理(沒有的話就不用設)

欄位設定
TargetField=SourceField

上圖的設定範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Migrate Task Batch]
taskType=Batch
sourceTable=STable
targetTable=TTable
checkField=BEGIN_DATE
checkType=
checkBeginValue=
checkEqual=
syncField=
condition=
extraField=
plugIn=

ID=ID
CODE=CODE
BEGIN_DATE=BEGIN_DATE

同步轉檔

依照所設定的同步欄位同步兩表,流程如下所示

  • 存在→更新
  • 不存在→新增
  • 額外→刪除


設定說明如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* : 一定要設定
- : 不一定要設定
' : 不用設定

[Migrate Task Sync]
* taskType=Sync
* sourceTable=來源表名
* targetTable=目標表名
- checkField=非整表同步時的條件欄位(整表時就不用設定)
- checkType=條件欄位型態(整表時就不用設定)
- checkBeginValue=條件欄位的起始值(整表時就不用設定)
- checkEqual=條件欄位是否要等於(整表時就不用設定)
* syncField=同步時用來確認的欄位
- condition=來源表是否需要條件設定(沒有的話就不用設)
- extraField=來源表是否需要額外欄位(沒有的話就不用設)
- plugIn=是否需要額外處理(沒有的話就不用設)

欄位設定
TargetField=SourceField

上圖的設定範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Migrate Task Sync]
taskType=Sync
sourceTable=STable
targetTable=TTable
checkField=
checkType=
checkBeginValue=
checkEqual=
syncField=ID
condition=
extraField=
plugIn=

ID=ID
CODE=CODE
BEGIN_DATE=BEGIN_DATE

復製轉檔

直接刪除原表再整表轉入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* : 一定要設定
- : 不一定要設定
' : 不用設定

[Migrate Task Copy]
* taskType=Copy
* sourceTable=來源表名
* targetTable=目標表名
- checkField=非整表Copy時的條件欄位(整表時就不用設定)
- checkType=條件欄位型態(整表時就不用設定)
- checkBeginValue=條件欄位的起始值(整表時就不用設定)
- checkEqual=條件欄位是否要等於(整表時就不用設定)
' syncField=(不用設定)
- condition=來源表是否需要條件設定(沒有的話就不用設)
- extraField=來源表是否需要額外欄位(沒有的話就不用設)
- plugIn=是否需要額外處理(沒有的話就不用設)

欄位設定
TargetField=SourceField

上圖的設定範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Migrate Task Copy]
taskType=Copy
sourceTable=STable
targetTable=TTable
checkField=
checkType=
checkBeginValue=
checkEqual=
syncField=
condition=
extraField=
plugIn=

ID=ID
CODE=CODE
BEGIN_DATE=BEGIN_DATE

更新轉檔

依照設定的標記欄位更新所設定的欄位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
* : 一定要設定
- : 不一定要設定
' : 不用設定

[Migrate Task Update]
* taskType=Update
* sourceTable=來源表名
* targetTable=目標表名
* checkField=確認目前更新到那的標記欄位
- checkType=確認標記欄位的型態(如果是日期就不用輸入)
- checkBeginValue=確認標記欄位的起始值(沒有起始的話就不用設)
- checkEqual=比對時是否要等於前次最後的值(大於的話就不用設)
* syncField=更新時的條件欄位(下方的Field必需設定該欄位)
- condition=來源表是否需要條件設定(沒有的話就不用設)
- extraField=來源表是否需要額外欄位(沒有的話就不用設)
- plugIn=是否需要額外處理(沒有的話就不用設)

* Where Field
TargetField=SourceField

* Update Field
TargetField=SourceField

上圖的設定範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Migrate Task Update]
taskType=Update
sourceTable=STable
targetTable=TTable
checkField=BEGIN_DATE
checkType=
checkBeginValue=
checkEqual=
syncField=ID
condition=
extraField=
plugIn=

'Where Field
ID=ID

'Update Field
CODE=CODE
BEGIN_DATE=BEGIN_DATE

PlugIn

可以透過 INI 設定,讓每個 Task 設定多個 PlugIn

PlugIn 處理過的值會依序帶到下一個 PlugIn ,且在轉資料的前及後都會觸發一個事件,以 Etl PlugIn 為例如下圖,把來源資料的 BOM_NAME 轉為 BOM_ID ,就可以透過 BeforeMigrate 把來源的資料轉置。

時區

透過 INI 設定目前時區

有掛入 Etl PlugIn 的 Task 都會自動把所有的時間轉成 UTC 的時間

Source Code

Download

參考

Oracle Migrations
dbMigration .NET