天天看點

SQL Server 中心訂閱模型(多釋出單訂閱)

大多數SQL Server 複制拓撲都是基于中心釋出模型,它是由一個釋出複制到一個或者多個訂閱。另一個複制模型是中心訂閱模型,它使用事務複制由多個釋出複制到一個訂閱中。

SQL Server 中心訂閱模型(多釋出單訂閱)

中心訂閱模型用于從多個資料源中合并資料,例如:

》從多個資料倉庫中彙總庫存到企業總部的中心伺服器;

》同一個公司中從持續發送遠端辦公資料到中心辦公系統中;

》合并訂單資訊到同一個地方集中處理。

預設情況下,訂閱通過快照代理初始化生成快照并被分發代理應用。當快照被應用時,預設情況 項目(article)屬性 “名稱已被使用時的操作(Action if name is in use)" 設定為 "删除先有對象并重新建立(Drop existing object and create a new one)" ,意思是當訂閱中存在目标表對象時将被删除,并重新建立該對象。在中心訂閱模型中,當從多個釋出中應用快照時這種設定是有問題的。第一個快照應用是正常的,後續的快照應用時将會清除掉前一個快照的資料。

解決這個問題的方法是水準分區,設定靜态行篩選器,設定屬性 “名稱已被使用時的操作”為 “删除資料,如果目标有行篩選器,僅删除與該篩選器比對的資料(Delete data,If article has a row filter, delete only data that matches the filter)”

現在,本人使用2個分庫資料,合并到另一個資料庫中:

SQL Server 中心訂閱模型(多釋出單訂閱)

【設定水準分區标志】

預設情況下,表結構如下:

如果這樣,id 自增量肯定有重複鍵,是以增加一個标志列 [LocationID],并如 id 列作為組合鍵。如下,分别在兩個釋出資料表中建立表。

此時就可以使用字段 [LocationID] 來确定是不同資料庫的資料了,在同一個訂閱表中就不會有主鍵重複問題了。但是當在其中一個釋出初始化時,或者操作資料時,怎麼區分來自不同的釋出資料庫的資料呢?接下來設定靜态行篩選器,非常重要!

【設定靜态行篩選器】

此時可以在 資料庫 [TestDBSubA] 或 [TestDBSubB] 的伺服器中建立釋出了,使用的是事務複制,選擇需要釋出的表,如下圖:

SQL Server 中心訂閱模型(多釋出單訂閱)

下一步,設定行篩選器,篩選條件為 [LocationID]=1(這個是資料庫 [TestDBSubA] 的釋出),同理設定 [TestDBSubB] 的釋出!

SQL Server 中心訂閱模型(多釋出單訂閱)
SQL Server 中心訂閱模型(多釋出單訂閱)

接下來一步步完成即可。還有一步重要的設定,釋出表對象的屬性。其實在上一步在操作中也可以設定。

【設定表項目的應用屬性】

右鍵剛建立完成的釋出,選擇屬性,選擇項目,可以選擇設定一個表或者所有表。如圖:

SQL Server 中心訂閱模型(多釋出單訂閱)

選擇設定所有表,設定屬性 “名稱已被使用時的操作”為 “删除資料,如果目标有行篩選器,僅删除與該篩選器比對的資料(Delete data,If article has a row filter, delete only data that matches the filter)”

SQL Server 中心訂閱模型(多釋出單訂閱)

設定完成後确定推出!

同理設定 [TestDBSubB] 的釋出!(注意 [LocationID] = 2)

訂閱正常設定,兩個釋出的訂閱都是同一個資料庫。

SQL Server 中心訂閱模型(多釋出單訂閱)

先後分别初始化應用快照,正常!

SQL Server 中心訂閱模型(多釋出單訂閱)

現在測試,分别在兩釋出資料庫中插入資料。

SQL Server 中心訂閱模型(多釋出單訂閱)

結果合并了!!所有DML操作正常同步!資料可以正常操作同步,但是字段增删改則有問題!!