2015-04-17 74 views
5

我正在爲我的公司開發一個項目,並且需要檢測另一家公司的表上的更改。換句話說,他們會插入/更新一些數據,我需要捕捉這些變化。我願意嘗試SQLDependency,但我不確定速度和性能,也需要許多權限。除了這些缺點,我不想錯過任何我需要的改變,時間在這個項目中非常重要。檢測sql-server表上的更改

如何以最佳性能檢測這些變化?

+1

我想你可以使用觸發器。看看https://msdn.microsoft.com/en-GB/library/ms189799.aspx – panagdu

+0

什麼權限*你有*到數據庫? –

+0

只需選擇。我們將根據項目的特性討論其他人。 –

回答

2

SQL依存度將不會爲你工作,如果你想確保數據不會錯過。 SQL依賴項僅在註冊應用程序的範圍內才能接收通知。這意味着,如果您的應用程序出於任何原因停機,則錯過了一些通知。

您需要查看更接近數據庫級別的事情,以確保獲得所有通知(數據更改)。

您可能可以使用更新臨時表的觸發器。使用觸發器時要小心。觸發器中的故障或緩慢響應可能會影響源數據庫操作的性能。

您可以啓用複製並處理應用程序中的副本數據,並標記您已處理的任何記錄。

+0

觸發器不適合我們,缺乏性能。 –

+0

你想要管理什麼樣的交易量? –

1

你可以看一下該功能「更改DataCapture」的SQL Server:https://msdn.microsoft.com/en-us/library/cc645937.aspx

+0

另請參閱更改跟蹤。這是一個更輕的解決方案,但可能會做你所需要的。 https://msdn.microsoft.com/en-us/library/bb933875.aspx –

+0

我做了,但是我找不到C#技術。 –

+0

沒有C#端。這就像查詢經典表或調用存儲過程一樣。如果你想或者實體框架,你可以使用Ado .Net。 – Pak

1

可以使用的SqlDependency類的開源實現 - SqlDependencyEx。它使用數據庫觸發器和本機Service Broker通知來接收有關表更改的事件。這是一個使用例:在args對象事件

int changesReceived = 0; 
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
      TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{ 
    sqlDependency.TableChanged += (o, e) => changesReceived++; 
    sqlDependency.Start(); 

    // Make table changes. 
    MakeTableInsertDeleteChanges(changesCount); 

    // Wait a little bit to receive all changes. 
    Thread.Sleep(1000); 
} 

Assert.AreEqual(changesCount, changesReceived); 

隨着SqlDependecyEx你能夠監測插入,刪除,單獨更新和接收實際改變的數據(xml)。希望這個幫助。

+0

你在這裏的changesCount參數是什麼?你從哪裏得到它? – Dominik

+0

@Dominik,這個代碼是作爲一個例子從單元測試中獲得的。 ChangesCount是一個硬編碼的期望值。你可以通過答案中提供的鏈接找到這個單元測試。 – dyatchenko