合并復(fù)制的概述 也許讀者對下面的實(shí)際例子并不陌生,在某一大型企業(yè)的分銷系統(tǒng)中,銷售經(jīng)理或一些銷售骨干人員經(jīng)常要外出處理業(yè)務(wù),將簽訂的合同通過手邊的筆記本電腦傳遞到總部銷售信息數(shù)據(jù)庫。在這一例子中有兩個主要的特;征任何銷售經(jīng)理和銷售骨干都可以修改銷售信息數(shù)據(jù)庫;只有在進(jìn)行數(shù)據(jù)傳遞時才將源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫相連。在sql server 中,合并復(fù)制為這一情況提供了較好的解決方案。
可以看出盡管最后所有的數(shù)據(jù)庫都有相同的結(jié)果集,但這個結(jié)果是在多個節(jié)點(diǎn)共同參與下形成的,是多個修改合并到目標(biāo)數(shù)據(jù)庫的結(jié)果。因此合并復(fù)制并不維護(hù)事務(wù)的一致。 與創(chuàng)建快照復(fù)制和事務(wù)復(fù)制出版物相比,當(dāng)創(chuàng)建一個合并出版物時,sql server 會對數(shù)據(jù)庫以及出版表進(jìn)行以下處理(見圖16-54):
(1) sql server 把出版表中的每一行都加上一個標(biāo)識列,這樣在表的多個拷貝間能惟一標(biāo)識出該行。如果基本表上已存在具有rowguidcol 屬性的標(biāo)識列,則 sql server 將自動把其作為復(fù)制表的行標(biāo)識,如果沒有,則或在創(chuàng)建出版物過程中這些表被激活時,或在sql server agent 第一次為該出版物提供服務(wù)時, sql server 將向表中添加一個具有rowguidcol 屬性的rowguid。
(2) sql server 添加一個觸發(fā)器來跟蹤每一行或列數(shù)據(jù)的變化,并把捕捉到的變化存儲到幾個系統(tǒng)表中,或在創(chuàng)建出版物過程中復(fù)制表被激活時,或在sql server agent 第一次為出版物提供服務(wù)時,將創(chuàng)建這些跟蹤觸發(fā)器。 (3) sql server 把用戶跟蹤的系統(tǒng)表添加到數(shù)據(jù)庫,來執(zhí)行沖突的檢測,解決和記錄。msmerger_contents msmerger_tombstone 系統(tǒng)表用來跟蹤對出版物中數(shù)據(jù)的update、 delete、 inserts 操作。