2022年4月6日 星期三

SQL Server - 如何設置單向式合併式複寫

 SQL Server - Replication 複寫是一個在很早的版本就已存在的技術,由於其特性,所以其實有許多的使用者使用,基本上四種常見的複寫上有何差異我就不在特別的介紹,因為已有許多的文章進行說明與比較,而在上一篇文章中,我介紹如何在 AWS RDS for SQL Server 與地端的 SQL Server 進行合併式複寫,這一篇我就再來進一步的介紹如果強制設定單向式的合併式複寫。

優點:

一般複寫在維護上,最怕的就是遇到衝突或是複寫過慢等問題,由於在交易式複寫 (Transactional replication) 與點對點式複寫 (Peer-to-peer replication) 的部份,一遇到衝突,絕大部份需要透過重新建立的方式進行,所以當業務上的需求只需要將資料複寫至遠端時,設定設定成單向式複寫,即可保證目的端的資料不會被變動到。

前一篇設定參考:

如何透過Merge Replication 複寫機制,同步 EC2 與 AWS RDS for SQL Server 的資料庫https://caryhsu.blogspot.com/2022/03/merge-replication-ec2-aws-rds-for-sql.html

詳細的設定方式,可能參考上述文章的介紹,但在加入表格 (Articles) 時,可以再進一步的設定即可,所以我就直接說重點的部份。

1. 先選擇好你要複寫的表格後,然後再點選右上角的 [Article Properties] -> [Properties for All Table Articles].


2. 開啟設定後,您會看到 [Synchronization direction] 的部份,預設為 Bidrectional ,這時可以開啟此設定,你會看到有三個選項。

  • Bidirectional: 雙向式復寫,這也是預設值。
  • Download to Subscriber, prohibit Subscriber changes: 只允許發行端可進行修改,而且當訂閱端進行資料變更時,會發生錯誤訊息,並且不允許進行變更,另外也不會將訂閱端的資料回寫回發行端。
  • Download to Subscriber, allow Subscriber changes: 允許發行端與訂閱端皆可進行修改,但並不會將訂閱端的資料回寫回發行端,而且發行端的數據,也會覆蓋到訂閱端。

此處我們建議可以設定第2項與第3的部份,二者的差異在於,當如果設定為 [Download to Subscriber, prohibit Subscriber changes] 時,如果你在訂閱端進行資料的修改時,就會發生下列的錯誤訊息。

錯誤訊息:
No row was updated.

The data in row 1 was not committed.
Error Source: .Net SqlClient Data Provider.
Error Message: Table '[Person].[Address]' into which you are trying to insert, update, or delete data has been marked as read-only, Only the merge process can perform these operations.



另外如果在已設定好的機器上,需要進行上述的修改時,也是一樣可以的,只是最後在修改後,需要再進行重建快照的動作後即可。