我知道數據庫觸發器並且沒有尋找該選項。我想知道是否可以用中間件的閱讀器觀察數據庫表。如何使用SQL CLR類型進行封裝或觀察
問題 - 是否可以使用數據庫表上C#中的SQL CLR類型來獲得可觀察的包裝,例如:我有一張門票,我怎麼看桌子。
我知道數據庫觸發器並且沒有尋找該選項。我想知道是否可以用中間件的閱讀器觀察數據庫表。如何使用SQL CLR類型進行封裝或觀察
問題 - 是否可以使用數據庫表上C#中的SQL CLR類型來獲得可觀察的包裝,例如:我有一張門票,我怎麼看桌子。
不,SQLCLR沒有提供任何特殊的手段。
的最好的,最合適的,只有的方式來完成讓表的修改的通知是通過觸發器。這就是他們要做的。您可以通過DML觸發器捕獲數據更改(對於INSERT
,UPDATE
和DELETE
操作),並且可以通過DDL觸發器捕獲結構更改(對於ALTER TABLE
,CREATE/ALTER/DROP TRIGGER
和CREATE/DROP INDEX
操作)。
您可以創建使用純T-SQL或使用SQLCLR任何類型的觸發器,雖然SQLCLR選項不超過不起T-SQL多少好處除了能夠通過動態SQL來訪問inserted
和deleted
僞表。使用SQLCLR觸發器的另一個原因是,如果您只需要來自一個或兩個僞表的所有行數據以執行單個操作。否則,如果需要按行處理某些內容,則可以在T-SQL觸發器中調用SQLCLR用戶定義的函數。
請記住,觸發器是DML操作啓動時內部創建的事務(如果當前沒有事務處於活動狀態)的一部分。這樣,如果DML操作最終失敗,觸發器所做的任何更改都可以回滾。
如果你想要非常輕量級的通知,你可以執行以下操作之一,但請記住,兩者都會使事務處於旁觀狀態(即無法收回未完成操作的通知),因此可以很容易導致假陽性(即修改,從來沒有承諾的通知):
通過sp_send_dbmail發送電子郵件。這是異步的,所以不應該對性能產生負面影響。但是您確實需要在觸發器中將整個數據修改報告格式化爲字符串(可能是HTML?),而不是附加查詢結果,因爲電子郵件查詢將無法訪問僞表。
使用SQLCLR將所需的信息轉儲到文本文件。您只需要小心以允許多個併發的寫入請求到文件,否則併發的DML語句將受到負面影響。
有關查詢通知快速注意,因爲這個問題被標記爲的SqlDependency:
查詢通知是不是真的有幫助這裏。除了限制哪些查詢符合查詢通知的限制之外,它們僅指示特定查詢的結果集已更改。因此,即使您爲SELECT * FROM table;
設置了簡單通知,它也不會告訴您什麼特定更改(即觸發器中可用的INSERTED
和/或DELETED
僞表中的行)。不過,如果你有興趣對他們的閱讀了,這裏有兩個有用的鏈接:
謝謝 - 順便說一句,我想盡量減少代碼,以便其乾淨的閱讀和容易我:)有沒有辦法打開通知從數據庫到表內當我設置POCO或實體模型或statup時,我的中間件? – transformer
@transformer Yer歡迎:-)。並不確定你的意思。你真的要使用查詢通知,還是你的意思是創建觸發器? –
查詢通知鏈接(2)中的所有3個選項似乎非常相似。對於我來說,任何一個選項都可以工作,至於在CLR中暴露出一些鉤子,所以我不必擔心觸摸數據庫。在中間件內部搜索一些更多的通知之後 - 看起來有一些[接線要做](http://stackoverflow.com/questions/16383513/how-to-use-sqlcachedependency)以使其工作。令人遺憾的是,可跟蹤的實體並不健壯,如果EF在模型level_默認情況下提供更改跟蹤選項。 – transformer
究竟是什麼,你要完成?如果我正確理解你的問題,答案是否定的。 –
@srutzky我有很多表(和POCO,s)我試圖在數據庫(編輯)發生表中的事情時得到changeNotifications。我認爲SQL CLR有掛鉤這些更改通知。只是尋找最簡單的方式來獲得這些變化表 – transformer