天天看點

SqlServer調用外部程式實作資料同步

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

SqlServer調用外部程式實作資料同步

在SyncA和SyncB中分别建立Source表和Target表,實際業務中,兩張表的結構大多不相同。

SqlServer調用外部程式實作資料同步
SqlServer調用外部程式實作資料同步

然後建立一個類庫的項目:MySync(注意項目的版本,Sql08不支援的.net 4.0及更高版本)

SqlServer調用外部程式實作資料同步

下面是同步程式代碼:

SqlServer調用外部程式實作資料同步
SqlServer調用外部程式實作資料同步

啟用CLR功能:預設情況下,Sql Server中的CLR是關閉的,是以我們要執行如下指令打開SyncA資料庫的CLR。

SqlServer調用外部程式實作資料同步

注冊DLL:

SqlServer調用外部程式實作資料同步

建立登入名和密鑰,如果程式集有變更,要删除密鑰和登入名重新建立:

建立程式集,DLL變更後要删除重新建立:

然後建立一個函數用于調用這個DLL:

先來測試一下,在SyncA中執行查詢:

SqlServer調用外部程式實作資料同步

SyncB中添加了一條資料:

SqlServer調用外部程式實作資料同步

下面使用觸發器自動的從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>