1. 程式人生 > >SQLServer 可更新訂閱數據在線架構更改(增加字段)方案

SQLServer 可更新訂閱數據在線架構更改(增加字段)方案

沖突 enter 構圖 pos 另一個 系統 from 分享圖片 span

原文:SQLServer 可更新訂閱數據在線架構更改(增加字段)方案

之前一直查找沖突發布和訂閱數據不一致的原因,後來發現多少數據庫升級引起,因為一直以來都是在發布數據庫增加字段,訂閱也會自動同步。在此時如果訂閱隊列有數據,這些數據將丟失。參考上一篇說明:SQLServer 可更新訂閱數據沖突的一個原因 。當在發布數據庫增加一個字段時,系統同步存儲過程和觸發器都會重新生成,這會導致仍在隊列中的數據無法正常同步。訂閱隊列中的命令將因“同步”後消失,代理有可能出錯,但也會自動回復正常!~


這周測試了一些方法,最終算是確定一個方案可行的,雖然麻煩和耗時。

首先看簡單的架構圖:

技術分享圖片

上圖中,上面為發布服務器,下面為訂閱服務器。以一個表為例,正常發布為 Table T1 的可更新訂閱發布,數據雙向同步,用戶都是在訂閱數據庫操作,都是操作視圖。增加字段時,為了使用戶能夠在訂閱正常操作,再創建一個發布訂閱,只發布一張表,數據太多時初始化會較久。註意:新的發布不能是同一個數據庫!如果是同一個數據庫,為了避免和原來的表名一樣,更改了新訂閱的表名,會導致 發布到原來的訂閱數據不同步!所以新的訂閱在另一個數據庫上,保持表名稱一致!因為系統調用的存儲過程表結構一致。~如上圖,所以一個發布中,在訂閱服務器中要求兩個數據庫訂閱,其中一個發布訂閱只有一張表,該表將是新增字段的表。此時3張表都同步發布雙向同步。


因為用戶都是操作視圖的,所以視圖的定義改為到新的數據庫表中,用戶操作仍正常,數據同步也正常。對新增加的發布,禁止架構同步,發布數據庫增加字段時,不會同步到新訂閱表中,但是會同步到原訂閱表中。待字段同步完成後,視圖定義改回原來的表,此時發布和訂閱都有新字段了。而作為中介創建的的發布訂閱可以刪除了!~


主要步驟如下:

1. 確保發布和訂閱數據一致

2. 創建1個可更新訂閱發布,只發布1張表 (發布數據庫執行)

3. 新發布的“沖突解決策略”: 保留發布服務器更改(發布屬性更改)

4. 新發布的“復制架構更改”: false(發布屬性更改)

5. 創建訂閱(訂閱服務器新的數據庫)

6. 更改作業所有者;初始化訂閱;等待完成…………

7. 發布更改視圖定義(會同步到原訂閱中),使用另一個數據庫的訂閱表(發布數據庫執行,註意訂閱表權限問題)

8. 確定原訂閱的隊列已經同步完成

9. 發布數據庫中對表增加字段(自動同步到原訂閱中,新訂閱不同步)

10. 訂閱隊列如無積累,更改發布視圖的定義,使用原來數據庫的表(發布數據庫執行)

11. 最後刪除新創建的發布


--1.	確保發布和訂閱數據一致
--2.	創建可更新訂閱(篩選)發布,只發布1表(發布數據庫執行)
--3.	新發布的“沖突解決策略”: 保留發布服務器更改(發布屬性)
EXEC sp_changepublication @publication = N'temp02', @property = N'conflict_policy', @value = N'pub wins'
EXEC sp_changepublication @publication = N'temp03', @property = N'conflict_policy', @value = N'pub wins'

--4.	新發布的“復制架構更改”: false(發布屬性)
EXEC sp_changepublication @publication = N'temp02', @property = N'replicate_ddl', @value = 0
EXEC sp_changepublication @publication = N'temp03', @property = N'replicate_ddl', @value = 0

--5.	創建訂閱(訂閱服務器新的數據庫)
--6.	更改作業所有者;初始化4個訂閱;等待完成…………
--7.	發布更改視圖定義,使用另一個數據庫的訂閱表(發布數據庫執行,註意訂閱表權限問題)
ALTER VIEW [dbo].[VTestTab]  
as  
SELECT Identifier,Name,value,info  
FROM DemoDB.dbo.TestTab --另一個訂閱數據庫的表
GO

--8.	確定原訂閱的隊列已經同步完成
--9.	發布數據庫中對表增加字段(自動同步到原訂閱中)
ALTER TABLE dbo.TestTab ADD TEST INT

--10.訂閱隊列無太多,則更改發布視圖定義,使用原來數據庫的表(發布數據庫執行)
ALTER VIEW [dbo].[VTestTab]  
as  
SELECT Identifier,Name,value,info  
FROM dbo.TestTab 
GO

--11.刪除新創建的發布


測試完成!~個人測試正常,還未應用到生產庫中。其中最麻煩的是要初始化表數據,這是主要耗時的。

SQLServer 可更新訂閱數據在線架構更改(增加字段)方案