2011-03-14 112 views
3

每當在sql server表中插入或更新記錄時,我必須調用第三方服務來插入/更新他們的表。什麼是最有效的方法來做到這一點?Sql服務器觸發到.net調用

  1. SQL服務器觸發到.NET調用(我不知道這是可能的...是否有可能記錄的ID發送給每當插入/更新出現.Net應用程序?)

  2. 應用程序使用select語句連續檢查表中的更改,獲取特定記錄 - >通過服務發送。

  3. 還有其他的東西嗎?

+5

其他數據庫是否也是SQL Server數據庫?如果是這樣,你可以看看Service Broker,一個SQL Server的消息框架:http://msdn.microsoft.com/en-us/library/bb839489.aspx – camainc 2011-03-14 17:28:12

+5

在我看來,即使服務代理其他服務器不是SQL Server。您可以使用觸發器將消息放入隊列中(在同一數據庫中),並寫入隊列處理器以執行Web服務調用。 SQL Server擁有的線程上的服務調用不是要走的路。 – JohnC 2011-03-14 17:36:19

+0

@John,@camainc ..謝謝你的回答..你能否提供關於如何在sql server中訪問隊列的信息/文章?另外,由於我對服務經紀人不熟悉,你認爲以下是一個好的選擇嗎?將插入/更新原始表的外部應用程序的記錄ID插入到單獨的表中 - >在此表上連續執行外部應用程序檢查 - >處理後刪除此表中的記錄。 – user441660 2011-03-14 20:14:22

回答

3

在SQL Server 2005及以上的,你必須創建CLR Stored Procedures其中存儲運行標準的.NET代碼程序,而不是SQL相關代碼的能力。它可以做什麼有一些限制,但是您可以輕鬆創建一個插入觸發器,將新記錄的@@ IDENTITY添加到執行所需.Net處理的CLR存儲過程中。

+0

+1,它創建這些實際上非常簡單直接,但它確實需要一些服務器配置更改。調用外部Web服務可能需要運行SQL Server的帳戶的額外權限。 – StingyJack 2011-03-14 18:41:07

+1

最糟糕的解決方案。在第一個地方,它只假定一條記錄,它也使用@@ idnetity而不是插入的表(並且@@ identitiy已知是不可靠的)。而且您不希望觸發器包含對第三方服務的調用,或者如果記錄發生故障,則不能更改記錄。 – HLGEM 2011-03-14 19:12:11

+0

**如果第三方系統響應緩慢,則觸發器中的任何**都不能阻止。觸發器應該寫入消息代理隊列,然後如果需要,隊列應該調用具有CLR存儲過程的外部系統。 – 2014-07-16 18:38:42

0

很久以前我工作的一個應用程序, 每個「數據」表

  • 有一個歷史表中記錄的所有插入,刪除和修改
  • 每個「邏輯」交易有史ID,可用於查找它在所有歷史記錄表中的變化
  • 歷史ID是int值增加的整數,因此第三方系統可以查找自上次檢查以來的所有更改通過從XyxHistory執行選擇進行檢查,其中historyId> lastProcessHistoryId
  • 觸發器被用於更新歷史表
  • 上述大部分的是使用從CodeSmith中的數據表

這使許多第三方系統,而無需改變所述主應用程序代碼被集成生成。