首先建立兩個資料庫:SyncA是資料源,SyncB是對SyncA進行同步的資料庫。

在SyncA和SyncB中分别建立Source表和Target表,實際業務中,兩張表的結構大多不相同。
然後建立一個類庫的項目:MySync(注意項目的版本,Sql08不支援的.net 4.0及更高版本)
下面是同步程式代碼:
啟用CLR功能:預設情況下,Sql Server中的CLR是關閉的,是以我們要執行如下指令打開SyncA資料庫的CLR。
注冊DLL:
建立登入名和密鑰,如果程式集有變更,要删除密鑰和登入名重新建立:
建立程式集,DLL變更後要删除重新建立:
然後建立一個函數用于調用這個DLL:
先來測試一下,在SyncA中執行查詢:
SyncB中添加了一條資料:
下面使用觸發器自動的從SyncA中将資料同步到SyncB中,其中的tt表是我臨時建立的,用于儲存觸發器調用傳回的結果:
直接執行函數沒有問題,但是觸發器去調用函數執行卻出現異常:
這個錯誤中包含了一個false值,說明觸發器調用時已經可以走到DLL這一步了。考慮到在查詢中直接執行函數,走到DLL這一步是沒有錯誤的。那麼錯誤就發生在觸發器和DLL調用産生的沖突,沖突在通路資料庫上面,再深入的原因,我也沒有找到。
下面使用另外一種方式實作同步,因為錯誤是觸發器和DLL的資料庫通路沖突,那麼我就繞過資料庫的通路。将觸發器産生的SQL腳本儲存到某個目錄下面,然後通過其他程式監聽這個目錄,執行腳本檔案,實作同步。
類庫代碼
另外建立一個監聽程式:MyListen
參考:
<a href="http://msdn.microsoft.com/zh-cn/library/Microsoft.SqlServer.Server.SqlFunctionAttribute_properties(v=vs.100).aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/Microsoft.SqlServer.Server.SqlFunctionAttribute_properties(v=vs.100).aspx</a>
<a href="http://blog.sina.com.cn/s/blog_59c41d0d0100esjn.html" target="_blank">http://blog.sina.com.cn/s/blog_59c41d0d0100esjn.html</a>
<a href="http://www.cnblogs.com/wshcn/archive/2011/12/02/2271630.html" target="_blank">http://www.cnblogs.com/wshcn/archive/2011/12/02/2271630.html</a>
<a href="http://www.cnblogs.com/edong/archive/2010/03/10/1682172.html" target="_blank">http://www.cnblogs.com/edong/archive/2010/03/10/1682172.html</a>
<a href="http://www.cnblogs.com/hsrzyn/archive/2013/05/28/1976555.html" target="_blank">http://www.cnblogs.com/hsrzyn/archive/2013/05/28/1976555.html</a>