對於資料來源向同一資料目標匯出(我們稱之為“資料彙集”)和增量匯出來說,對主鍵的處理也是一個大的挑戰。
我先定義一下在本DTS系統中主鍵(PrimaryKey)的含義:PrimaryKey 表示主鍵或聯合主鍵,PrimaryKey並不是針對某個資料庫表的,而是針對某個特定的DataMapping而言的,它用於在資料移轉過程中來唯一確定資料來源或資料目標中每條記錄。
所以,本DTS系統中的PrimaryKey很多時候就是資料庫表的主鍵,有些時候則可能不是,只要它能滿足“唯一確定資料來源或資料目標中每條記錄”的要求就可以。 PrimaryKey結構如下: [Serializable]
public class PrimaryKey
{
private IList<string> subKeyList = new List<string>();
#region AddSubKey
public void AddSubKey(string subKey)
{
foreach (string key in this.subKeyList)
{
if (key == subKey)
{
return;
}
}
this.subKeyList.Add(subKey);
}
#endregion
#region Clear
public void Clear()
{
this.subKeyList.Clear();
}
#endregion
#region IsUnionPKey
public bool IsUnionPKey
{
get
{
return (this.subKeyList.Count > 1);
}
}
#endregion
#region KeyColumnList
public IList<string> KeyColumnList
{
get
{
return this.subKeyList;
}
}
#endregion
}
在DTS開發記錄(5)-- 挑戰增量匯出 一文中,我們已經知道,目前擷取增量的方法只有“比對”--即一個欄位一個欄位的比較。在通過“比對”分析增量的時候,對於Insert增量和Update增量,通過是非常容易識別的(雖然效率不高,但是仍然可行)。但是對於Delete增量了?
1.Delete增量對主鍵的要求
Delete增量需要通過反向比較才可獲得,即從資料目標中取出一條記錄,然後在資料來源中查看是否有匹配的記錄。這個匹配如何進行了?通過主鍵。是的,當然是通過主鍵進行定位,但是如果資料來源的主鍵沒有參與映射、或者資料來源主鍵參與了複雜的映射或變形,則就不那麼容易了。我們來詳細分析一下。
(1)資料來源主鍵沒有參與映射。
如果資料來源主鍵沒有參與映射,那麼對應的資料目標中也不會出現與資料來源主鍵相應的值,因而無法通過資料目標中的記錄來反向定位元據源中的記錄。
(2)資料來源主鍵參與了變形。
如果資料來源主鍵參與了變形,則根據資料目標記錄中的欄位值來進行逆向求解資料來源主鍵的值非常困難,而且很多變形公式是無法復原的。
(3)資料來源主鍵參與了合并。
與資料來源主鍵參與了變形的情況一樣,逆向求解合并運算式更是困難。而且,絕大多數合并運算式都不是可以逆向求解的,因為參與合并的源列至少有兩個,這更大的增加的變數。
所以,要想通過“比對”完成Delete增量,必須要求主鍵滿足以下條件:
(1)資料來源主鍵必須參與映射。即PrimaryKey.KeyColumnList屬性中的每個列都要參與映射。
(2)資料來源主鍵在映射中不能攜帶變形,即對應的IMappingItem的TransformRule屬性值為null。
(3)資料來源主鍵不得參與合并映射。
2.“資料彙集”對主鍵的要求
我們假設這樣的情況:各個省局需要向國家局定時匯出自己的財政資料(存放於一個資料表中),所有省局的財政資料表的結構完全一致,而國家局的財政資料表與省局的稍有差別。這是一個典型的“資料彙集”的例子。
省局的財政資料表中有唯一主鍵ID,但是這個主鍵對應的映射目標鍵在國家局的財政資料表中則不再是主鍵了,因為不同的省局的財政資料中很可能存在ID相同的記錄。這種”主鍵失效“的情形在“資料彙集”應用中是經常碰到的。
在這種情況中,不僅Delete增量無法識別,而且Insert增量和Update增量也無法識別了。因為無法從目標資料進行反向定位元據源中的記錄了。
通常,在“資料彙集”的應用中,比如上面的例子,國家局的財政資料表都會有個欄位表明對應的記錄來自於哪個省局,這個欄位非常重要,正是有了它,我們才能進行增量分析。這個欄位的值對於同一個省局來說是不變的,所以在資料來源中我們可以虛擬一個名為“常量值輔助主鍵”的列,這個列並不實際存在,但是它參與映射,並且這個列的值是恒定不變的。
通過“常量值輔助主鍵”和原來的資料來源主鍵的結合,我們則可以解決“資料彙集”應用中主鍵失效的問題。
所以,我們可以加上下面這條對主鍵的要求:
(4)如果需要進行資料彙集,則可能需要設定“常量值輔助主鍵”。
如果啟用了“常量值輔助主鍵”,則要求:
(1)常量值輔助主鍵必須參與映射。
(2)常量值輔助主鍵只能參與一個映射。
(3)常量值輔助主鍵的匹配目標列必須也是主鍵。
(4)常量值輔助主鍵不得參與合并映射。
(5)常量值輔助主鍵不得參與變形。
2006.07.28 附加:
比對增量要求:
(1)源PrimaryKey中的每個子鍵都參與簡易對應=》才能從目標記錄定位源記錄=》發現delete增量
(2)設定目標PrimaryKey=》從源記錄定位目標記錄=》發現Update和Add增量。如果是資料彙集,則需要“常量值輔助主鍵”的協助。
觸發器增量要求:
(1)源PrimaryKey(加上“常量值輔助主鍵”)與目標PrimaryKey是一一對應的關係=》通過源PrimaryKey的值能定位目標記錄=》確定delete增量
轉到:DTS開發記錄(序)