事件通知

適用於:SQL Server

事件通知會傳送事件的相關資訊給 Service Broker 服務。 事件通知會將這些事件的資訊傳送給 Serviec Broker 服務,以回應各種 Transact-SQL 資料定義語言 (DDL) 陳述式和 SQL 追蹤事件。

事件通知可用來執行下列工作:

  • 記錄和檢閱發生在資料庫的變更或活動。

  • 執行動作以非同步而不是同步的方式來回應事件。

事件通知可提供程式設計替代方案給 DDL 觸發程序和 SQL 追蹤。

事件通知優點

事件通知會以非同步方式在交易範圍以外執行。 因此,與 DDL 觸發程序不同的是,事件通知可在資料庫應用程式中使用,以便回應未使用立即交易所定義之資源的事件。

和 SQL 追蹤不同,事件通知可用來在 SQL Server 執行個體內執行動作,以回應 SQL 追蹤事件。

與 SQL Server 一起執行的應用程式可使用事件資料來追蹤進度並進行決策。 例如,下列事件通知會在每次於 ALTER TABLE 範例資料庫中發出 AdventureWorks2022 陳述式時,將通知傳送給特定服務。

USE AdventureWorks2022;  
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 觸發程序名稱是由結構描述限定範圍。 DML 觸發程序名稱是以資料庫或伺服器限定範圍。 事件通知名稱是以伺服器或資料庫限定範圍。 在 QUEUE_ACTIVATION 事件上的事件通知是限定成特定的佇列。
DML 觸發程序是由套用觸發程序的資料表之相同擁有者所擁有。 佇列上的事件通知擁有者,有可能與套用事件通知的物件具有不同的擁有者。
觸發程序支援 EXECUTE AS 子句。 事件通知不支援 EXECUTE AS 子句。
DDL 觸發程序的事件資訊可以使用 EVENTDATA 函數來擷取,該函數會傳回 xml 資料類型。 事件通知會傳送 xml 事件資訊給 Service Broker 服務。 資訊將格式化成與 EVENTDATA 函數相同的結構描述。
與觸發程序相關的中繼資料可在 sys.triggerssys.server_triggers 目錄檢視中找到。 與事件通知相關的中繼資料可在 sys.event_notificationssys.server_event_notifications 目錄檢視中找到。

事件通知與 SQL 追蹤

下表比較使用事件通知和 SQL 追蹤來監督伺服器事件的異同。

SQL 追蹤 事件通知
SQL 追蹤不會產生與交易關聯的效能負擔。 資料的封裝很有效率。 建立 XML 格式事件資料與傳送事件通知有相關聯的效能負擔。
SQL 追蹤可以監督任何追蹤事件類別。 事件通知可以監督追蹤事件類別的子集,以及所有資料定義語言 (DDL) 事件。
您可以自訂在追蹤事件中要產生哪些資料行。 會修復事件通知所傳回的 XML 格式事件資料之結構描述。
不論 DDL 陳述式是否已回復,永遠都會產生 DDL 所產生的追蹤事件。 如果在對應 DDL 陳述式中的事件已回復,就不會引發事件通知。
管理追蹤事件資料的中繼流程,將需要擴展和管理追蹤檔案或追蹤資料表。 事件通知資料的中繼管理是透過 Service Broker 佇列自動完成。
每次重新啟動伺服器時都必須重新啟動追蹤。 在註冊後,事件通知會持續存在於伺服器週期中並已交易。
在初始化後,就無法控制追蹤的引發。 停止時間和篩選時間可用來指定初始化它們的時間。 是透過輪詢對應追蹤檔案來存取追蹤。 可以針對收到事件通知所產生的訊息之佇列,使用 WAITFOR 陳述式來控制事件通知。 可以透過輪詢佇列來存取它們。
ALTER TRACE 是建立追蹤所需的基本權限。 在對應電腦上建立追蹤檔案的權限也是必要的。 基本權限是視建立事件通知的類型而定。 在對應佇列上也需要 RECEIVE 權限。
可以遠端接收追蹤。 可以遠端接收事件通知。
追蹤事件是使用系統預存程序來實作。 使用資料庫引擎並搭配 Service Broker Transact-SQL 陳述式來實作事件通知。
透過查詢對應追蹤資料表、剖析追蹤檔案,或使用 SQL Server 管理物件 (SMO) 的 TraceReader Class,就可使用程式設計的方式來存取追蹤事件資料。 透過針對 XML 格式的事件資料發出 XQuery,或使用 SMO Event 類別,以程式設計方式來存取事件資料。

事件通知工作

Task 主題
描述如何建立及實作事件通知。 實作事件通知
描述如何針對可傳送訊息到遠端伺服器上 Service Broker 的事件通知,設定 Service Broker 對話安全性。 設定事件通知的對話安全性
描述如何傳回有關事件通知的詳細資訊。 取得事件通知詳細資訊

另請參閱

DDL 觸發程序
DML 觸發程序
SQL 追蹤