iT邦幫忙

0

關於MSSQL合併式複寫資料回溯問題

資料庫:
Microsoft SQL Server Web Edition (64-bit)

問題描述:
在發行者進行複寫動作之後
偶爾會有訂閱者的資料被回溯的現象
而SQL版本又無CDC或是Inserted與Deleted資料表可提供查詢資料變更歷程
會發現此問題是因為在訂閱者的資料庫中有寫變更紀錄
不過該變更紀錄是前端或是SP有針對欄位進行異動才會寫
且未寫入複寫的衝突紀錄中
而複寫頻率為每分鐘執行一次
加上又都是偶發狀況
無法有效的監控當下(複寫前及後)發行者及訂閱者的資料內容

想請教一下是否也有遇過類似現象或是建議的查詢方向呢

作 TRACERT 吧,如果你設計沒考慮交易問題,那就會發生這種問題了
目前的確是已有在使用profiler進行,只是沒有一個較明確的方向,正在找路中Q_Q
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
做工仔人!
iT邦大師 1 級 ‧ 2016-11-28 15:49:57

樓主的問題建議試著使用" Triggers"的方式處理.
可參考MySQL 超新手入門(16)Triggers 或是: 如何使用MS SQL的Stored Procedure與Trigger

PS : Triggers 的觀念不管是在MS SQL 或 MY SQL , Oracle 都一樣.
Triggers MS SQL中文翻成:觸發程序.
功能就是在TABLE中的資料有異動(INSERT/UPDATE/DELETE)時才會"觸發"的程式.
INSERT / UPDATE / DELETE 的觸發程序可以分開寫.

看更多先前的回應...收起先前的回應...

問題是...資料庫中並沒有INSERTED及DELETED這兩個表可以拿來建trigger及寫入紀錄.....

INSERTED 及 DELETED 這二個TABLE 是自己建的,並不是系統預設.
在新手入門的文章中有提到:

CREATE TRIGGER TRIGGER_NAME(TRIGGER的顯示名稱) 時機(要在動作發生之前-BEFORE 或是動作完成之後-AFTER) 動作(INSERT/UPDATE/DELETE)   
ON TABLE_NAME(要觸發的TABLE) FOR EACH ROW  
BEGIN  
   程式段  
END ;   

例:在DB(AAA)中有一個TABLE 名稱為 EMP(EMP_ID,EMP_NAME,DEPT_NO) ,希望當資料有新增(INSERT)時就同步 INSERT 到同一台主機的另一個DB(BBB)的相名TABLE中.
語法:

CREATE TRIGGER INS_BBB AFTER INSERT   
ON EMP FOR EACH ROW  
BEGIN  
   
   INSERT INTO BBB..EMP(EMP_ID,EMP_NAME,DEPT_NO)  
   VALUES (NEW.EMP_ID,NEW.EMP_NAME,NEW.DEPT_NO)  
END ;   

PS:NEW 不是TABLE , 指的是:當下新增的資料內容

其他的變化,就請樓主自行參酌.
也可以是用LOG的方式處理.
如EMP_LOG(EMP_ID,EMP_NAME,DEPT_NO,IDATE,ITIME)
除了記錄異動資料外也可以再增加記錄異動日期及異動時間.

感謝分享!!我會再去研究一下關於這兩個資料表...

我要發表回答

立即登入回答