2009-01-08 20 views
7

我想編寫一個監視數據庫表的服務(可能在c#中)。當一個記錄被插入到表中時,我希望服務獲取新插入的數據,並用它執行一些複雜的業務邏輯(對TSQL來說太複雜)。SQL CLR觸發器可以執行此操作嗎?或者,還有更好的方法?

一種選擇是讓服務定期檢查表以查看是否插入了新記錄。這樣做的問題在於,我希望服務在發生插入後立即知道,而且我不想殺死數據庫性能。

做了一點研究,似乎可能寫一個CLR觸發器可以完成這項工作。我可以在發生插入時觸發c#中的觸發器,然後將新插入的數據發送到Windows或WCF服務。

您如何看待SQL CLR觸發器的使用(甚至可能)?

有關如何完成此任何其他想法?

回答

6

也許你應該取消夫婦從後處理插入:

在INSERT觸發器,添加記錄的PK成隊列表。

在單獨的服務中,從隊列表中讀取並執行復雜的操作。完成後,將記錄標記爲已處理(與錯誤/狀態信息一起),或從隊列中刪除記錄。

+0

準確地說,我即將建議。它將事務安全,並將處理和未處理的記錄保存在不會影響主應用程序表的表中。 +1這個解決方案! – evilhomer 2009-01-08 23:34:21

+2

使用SQL Server Service Broker – 2009-02-10 23:49:45

3

您所描述的內容有時稱爲作業隊列或消息隊列。有幾個關於使用DBMS表(以及其他技術)的線程可以通過搜索找到。

我會考慮用Trigger做任何事情,因爲不適當地使用數據庫功能,很容易陷入麻煩。觸發器最適用於低開銷dbms結構功能(例如細粒度的參照完整性檢查),並且需要輕量級和同步。它可以完成,但可能不會是一個好主意。

1

我有一個服務,每分鐘輪詢數據庫,它不會造成那麼多的性能問題,它是一個乾淨的解決方案。此外,如果您的服務或其他wcf端點不在那裏,您的觸發器將失敗或丟失,您將不得不稍後進行輪詢。

1

我不會推薦使用CLR觸發器或任何類型的觸發器。你正在打開自己的嚴肅的可維護性和潛在的鎖定問題。 (一個非常簡單的觸發器可以將內容加載到審計/隊列表中,如果您在插入後不關心@@身份並且永遠不會鎖定審計/隊列表)

而是從您的應用程序/ orm你應該觸發插入到隊列表的東西,並定期處理這個隊列。這可以通過在ORM中執行事務或啓動存儲過程來完成,啓動事務會自動提交更改和審計/隊列。如果你需要立即採取行動,看看產卵工作以清除隊列你做一個插入/更新後的表/刪除和

還要確保你是雙重檢查(小心鎖在這裏)

如果後臺進程未正確啓動,則每分鐘排隊一次。如果它是一個Web應用程序,並且您希望避免產生線程,則可以與後臺進程進行通信以清除隊列。

-1

爲什麼不在存儲過程中實現插入,並在插入後執行過程中的業務邏輯?什麼是如此複雜,它不能用T-SQL編寫?

2

我建議在調用SQL Server Service Broker的表上有一個觸發器,然後(異步)執行一個CLR存儲過程,該過程在不同的線程中完成所有工作。

相關問題