事件通知會將事件的相關信息傳送至 Service Broker 服務。 事件通知會藉由將這些事件的相關信息傳送至 Service Broker 服務,以回應各種 Transact-SQL 數據定義語言 (DDL) 語句和 SQL 追蹤事件。
事件通知可用來執行下列動作:
記錄並檢閱資料庫上發生的變更或活動。
以異步而非同步方式執行動作以回應事件。
事件通知可以提供 DDL 觸發程式和 SQL 追蹤的程式設計替代方案。
事件通知權益
事件通知會以異步方式在交易範圍之外執行。 因此,不同於 DDL 觸發程式,事件通知可以在資料庫應用程式內用來回應事件,而不需使用立即交易所定義的任何資源。
不同於 SQL 追蹤,事件通知可用來在 SQL Server 實例內執行動作,以回應 SQL 追蹤事件。
與 SQL Server 一起執行的應用程式可以使用事件數據來追蹤進度並做出決策。 例如,下列事件通知會在每次 AdventureWorks2012 範例資料庫中發出語句時ALTER TABLE,傳送通知給特定服務。
USE AdventureWorks2012;
GO
CREATE EVENT NOTIFICATION NotifyALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE '//Adventure-Works.com/ArchiveService' ,
'8140a771-3c4b-4479-8ac0-81008ab17984';
事件通知概念
建立事件通知時,會開啟 SQL Server 實例與所指定目標服務之間的一或多個 Service Broker 交談。 只要事件通知以伺服器實例上的物件的形式存在,交談通常會保持開啟狀態。 在某些錯誤情況下,交談可能會在事件通知被撤回之前關閉。 這些交談從不會在事件通知之間被共用。 每個事件通知都有自己的專屬對話。 結束交談會明確防止目標服務接收更多訊息,而且下次引發事件通知時,交談將不會重新開啟。
事件資訊會以 類型的 xml 變數的形式傳遞至 Service Broker 服務,以提供事件發生時間、資料庫物件受影響、涉及的 Transact-SQL 批次語句及其他資訊的相關信息。 如需事件通知所產生的 XML 架構詳細資訊,請參閱 EVENTDATA (Transact-SQL) 。
事件通知與觸發程式
下表比較和對比觸發程式和事件通知。
| 觸發器 | 事件通知 |
|---|---|
| DML 觸發程式會響應數據操作語言 (DML) 事件。 DDL 觸發程式會回應資料定義語言 (DDL) 事件。 | 事件通知會回應 DDL 事件和 SQL 追蹤事件的子集。 |
| 觸發程式可以執行 Transact-SQL 或 Common Language Runtime (CLR) Managed 程式代碼。 | 事件通知不會執行程序代碼。 相反地,他們會將訊息傳送 xml 至 Service Broker 服務。 |
| 觸發程式會在導致觸發程序引發的交易範圍內,以同步方式處理。 | 事件通知可能會以異步方式處理,而且不會在引發事件通知的交易範圍內執行。 |
| 觸發程式的取用者與引發觸發程式的事件緊密結合。 | 事件通知的消費者與觸發該通知的事件是分離的。 |
| 必須在本地伺服器上處理觸發程式。 | 您可以在遠端伺服器上處理事件通知。 |
| 觸發程式可以回復。 | 無法回復事件通知。 |
| DML 觸發器名稱是限制於架構的範圍。 DDL 觸發程式的名稱可以受限於資料庫範圍或伺服器範圍。 | 事件通知名稱的範圍是由伺服器或資料庫決定。 QUEUE_ACTIVATION事件上的事件通知會限定於特定佇列。 |
| DML 觸發程式的擁有者與其應用的資料表擁有者相同。 | 佇列上事件通知的擁有者可能與套用事件通知的對象擁有者不同。 |
| 觸發程式支援EXECUTE AS子句。 | 事件通知不支援 EXECUTE AS 子句。 |
您可以使用 EVENTDATA 函式來擷取 DDL 觸發程式事件資訊,此函式會 xml 傳回數據類型。 |
事件通知會將事件資訊傳送 xml 至 Service Broker 服務。 資訊會格式化為與 EVENTDATA 函式相同的架構。 |
| 在 sys.triggers 和 sys.server_triggers 目錄檢視中找到有關觸發程式的元數據。 | 有關事件通知的元數據可在 sys.event_notifications 和 sys.server_event_notifications 目錄檢視中找到。 |
事件通知 vs. SQL 追蹤
下表使用事件通知和 SQL 追蹤來比較和對比,以監視伺服器事件。
| SQL 追蹤 | 事件通知 |
|---|---|
| SQL 追蹤不會產生與交易相關聯的效能額外負荷。 數據封裝是有效率的。 | 建立 XML 格式的事件數據並傳送事件通知時,會有效能額外負荷。 |
| SQL 追蹤可以監視任何追蹤事件類別。 | 事件通知可以監視追蹤事件類別的子集,以及所有數據定義語言 (DDL) 事件。 |
| 您可以自訂要在追蹤事件中產生的數據行。 | 已修正事件通知所傳回之 XML 格式事件數據的架構。 |
| 不論 DDL 語句是否被回滾,DDL 所產生的追蹤事件一律都會生成。 | 如果相應的 DDL 語句中的事件被回退,則不會觸發事件通知。 |
| 管理追蹤事件數據的中繼流程牽涉到填入和管理追蹤檔案或追蹤數據表。 | 事件通知數據的中繼管理會透過 Service Broker 佇列自動完成。 |
| 每次伺服器重新啟動時,都必須重新啟動追蹤。 | 註冊之後,活動通知會持續存在於伺服器週期,並進行交易。 |
| 一旦啟動,追蹤的觸發就無法控制。 停止時間和篩選時間可用來指定其起始時間。 追蹤記錄是透過查詢相關的追蹤檔案來存取的。 | 事件通知可以透過針對接收事件通知所產生訊息的佇列使用 WAITFOR 語句來控制。 您可以藉由輪詢佇列來存取它們。 |
| 要建立追蹤,所需的最低許可權是 ALTER TRACE。 也需要許可權,才能在對應的計算機上建立追蹤檔案。 | 最低許可權取決於所建立的事件通知類型。 對應佇列上也需要 RECEIVE 許可權。 |
| 您可以遠端接收痕跡。 | 事件通知可以從遠端接收。 |
| 追蹤事件是使用系統預存程序實作。 | 事件通知是使用 Database Engine 和服務 BrokerTransact-SQL 語句的組合來實作。 |
| 追蹤事件數據可以透過程序設計方式存取,方法是查詢對應的追蹤數據表、剖析追蹤檔案,或使用 SQL Server 管理物件 (SMO) TraceReader 類別。 | 事件數據是以程式設計方式存取,方法是對 XML 格式的事件數據發出 XQuery,或使用 SMO 事件類別。 |
事件通知工作
| 任務 | 主題 |
|---|---|
| 描述如何建立及實作事件通知。 | 實作事件通知 |
| 描述如何設定 Service Broker 對話安全性,以便將訊息傳送至遠端伺服器上的 Service Broker 以進行事件通知。 | 設定事件通知的對話框安全性 |
| 描述如何傳回事件通知的相關信息。 | 取得事件通知詳細資訊 |