在開發中,出於各種原因往往希望資料庫中的表可以同步,如果是同一個資料庫中的兩張表進行同步這個完全不是問題,一個觸發器就可以搞定了,如果是兩個資料庫中的表,甚至是一個區域網路或是廣域網路內的兩個資料庫同步,觸發器是完全派不上用場的。下面也就這個問題說說自己的一些想法。
就拿一個區域網路內的一台客戶機和一台伺服器上的資料庫進行同步吧,用戶端資料庫中表插入,刪除,修改同步到伺服器上相應的資料庫表中。或許這樣的問題沒有什麼實際的意義,現在假設有客戶有類似的需求,哈哈,客戶是上帝,只有實現了。其實此類問題有兩種方法可以解決:
①:藉助中間轉寄實現,建立一個winform用來轉寄資料,實現的過程就是用戶端資料庫和UI同步更新,UI獲知用戶端資料庫的變化再作用到伺服器上的資料庫,這種方法實際就是用winform和資料庫的同步更新來完成資料庫和資料庫的同步更新。
至於winform和資料庫的同步更新在之前的隨筆中有提到,方法也有好幾種,比較推崇的方法是利用觸發器將變化的資料發送到UI上,在UI上啟動監聽,即時監聽資料變化然後儲存到伺服器的資料庫上。這種方式的即時性很好,涉及到的知識包括Socket編程,資料庫調用DLL(SQL2000和SQL2005在調用DLL上有很大的區別)。可是算是一個技術性比較強的方法,不過卻很實用。(具體的一些實現可以參看之前的一些隨筆)
②:資料庫複寫技術,現在重點講講這個。
資料庫的複製技術同樣可以實現區域網路內兩個不同機器上的資料庫同步更新,關於這方面的操作不再可以查看http://life.lifesci.cn/html/gl/2008-11/7767.htm上的介紹,在實現了發行伺服器和訂閱伺服器後,選擇發布名稱右擊彈出屬性對話方塊,選擇狀態選項卡,可以啟動代理程式,同時也可以修改代理程式的屬性,修改代理程式屬性會彈出一個對話方塊(好像就是在作業建立的時候定義調度的那個對話方塊),可以看到調度選項卡,編輯調度,其中有四個選項(1):SQL Server代理啟動時自動啟動;(2):CPU閑置時啟動;(3):一次;(4):反覆出現。也就是說更新的最快頻率應該是一分鐘更新一次,對即時性要求不高的可以採用這種方式實現資料庫同步,畢竟不需要任何的代碼,只需要幾步設定就可以了。
從上面的介紹可不可以說資料庫的同步更新不適合對於即時性要求很高的同步更新(或許可以,但是目前還沒有研究出來),那這樣,是不是可以說SQL中內建的複製技術專門用於定時同步資料庫的,利用第一種方式可以彌補這種複製技術。最後,只能說,根據自己的需求選擇合適的方式才是最重要的!!