CREATE EVENT NOTIFICATION (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

建立一個物件,將資料庫或伺服器事件的相關資訊傳送給 Service Broker 服務。 只有使用 Transact-SQL 陳述式才能建立事件通知。

Transact-SQL 語法慣例

Syntax

CREATE EVENT NOTIFICATION event_notification_name   
ON { SERVER | DATABASE | QUEUE queue_name }   
[ WITH FAN_IN ]  
FOR { event_type | event_group } [ ,...n ]  
TO SERVICE 'broker_service' , { 'broker_instance_specifier' | 'current database' }  
[ ; ]  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

event_notification_name
這是事件通知的名稱。 事件通知名稱必須符合識別碼的規則,且在建立所在範圍內必須是唯一的:SERVER、DATABASE 或 object_name

SERVER
將事件通知範圍套用在目前的 SQL Server 執行個體上。 如已指定,只要 SQL Server 執行個體中有任一 FOR 子句發生指定的事件,都會引發通知。

注意

自主資料庫無法使用這個選項。

DATABASE
將事件通知範圍套用在目前資料庫上。 如果指定的話,每當目前資料庫發生 FOR 子句中所指定的事件時,都會引發通知。

QUEUE
將通知範圍套用在目前資料庫的特定佇列上。 只有在也指定了 FOR QUEUE_ACTIVATION 或 FOR BROKER_QUEUE_DISABLED 時,才能指定 QUEUE。

queue_name
這是套用事件通知的佇列名稱。 只有在指定 QUEUE 時,才能指定 queue_name

WITH FAN_IN
針對所有符合下列條件的事件通知,指示 SQL Server 每個事件只傳送一則訊息給任何指定的服務:

  • 在相同事件中建立。

  • 由相同主體建立 (由相同 SID 來識別)。

  • 指定相同的服務和 broker_instance_specifier

  • 指定 WITH FAN_IN。

例如,在建立三個事件通知的情況下。 所有的事件通知都會指定 FOR ALTER_TABLE、WITH FAN_IN、相同的 TO SERVICE 子句,並由相同的 SID 建立。 執行 ALTER TABLE 陳述式時,這三個事件通知建立的訊息將會合併為一則訊息。 因此,目標服務只會收到一則事件訊息。

event_type
這是造成執行事件通知的事件類型名稱。 event_type 可以是 Transact-SQL DDL 事件類型、SQL 追蹤事件類型,或 Service Broker 事件類型。 如需符合條件的 Transact-SQL DDL 事件類型清單,請參閱 DDL 事件。 Service Broker 事件類型為 QUEUE_ACTIVATION 和 BROKER_QUEUE_DISABLED。 如需詳細資訊,請參閱 Event Notifications

event_group
是預先定義之 Transact-SQL 或 SQL 追蹤事件類型群組的名稱。 在執行屬於事件群組的任何事件之後,便能夠引發事件通知。 如需 DDL 事件群組清單、其涵蓋之 Transact-SQL 事件以及可被定義的範圍,請參閱 DDL 事件群組

當 CREATE EVENT NOTIFICATION 陳述式完成時,透過將所涵蓋的事件類型加入 sys.events 目錄檢視中,event_group 也可以作為巨集。

'broker_service'
指定接收事件執行個體資料的目標服務。 SQL Server 會向事件通知的目標服務開啟一或多項交談。 這項服務必須遵照相同的 SQL Server 事件訊息類型和傳送訊息所用的合約。

這項交談會維持開啟狀態,直到卸除事件通知為止。 特定錯誤可能使交談提早關閉。 明確地結束部分或所有交談,可以防止目標服務接收其他訊息。

{ 'broker_instance_specifier' | 'current database' }
對已經解析的 broker_service 指定 Service Broker 執行個體。 您可以透過查詢 sys.databases 目錄檢視的 service_broker_guid 資料行,來取得特定 Service Broker 的值。 使用 'current database' 來指定目前資料庫中的 Service Broker 執行個體。 'current database' 是不區分大小寫的字串常值。

注意

自主資料庫無法使用這個選項。

備註

Service Broker 包含事件通知專用訊息類型和合約。 因此,您不需要建立 Service Broker 起始服務,因為已有指定了下列合約名稱的 Service Broker 起始服務:https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

接收事件通知的目標服務必須遵照這項預先存在的合約。

重要

您應該針對向遠端伺服器上的服務訊息代理程式傳送訊息的事件通知,設定 Service Broker 的對話安全性。 對話安全性必須根據完整安全性模型,以手動方式加以設定。 如需詳細資訊,請參閱設定事件通知的對話安全性

如果回復啟動通知的事件交易,也會回復事件通知的傳送。 當在觸發程序內認可或回復交易時,觸發程序內所定義的動作並不會引發事件通知。 由於交易並未繫結追蹤事件,不論是否回復啟動以追蹤事件為基礎的事件通知,都會傳送這些追蹤事件。

如果在引發事件通知之後,伺服器和目標服務之間的交談中斷了,就會報告一則錯誤,且會卸除事件通知。

事件通知的傳送,不論成敗,都不會影響最初啟動通知的事件交易。

事件通知的任何傳送失敗,都會記錄下來。

權限

若要建立以資料庫為範圍 (ON DATABASE) 的事件通知,需要目前資料庫的 CREATE DATABASE DDL EVENT NOTIFICATION 權限。

若要建立以伺服器為範圍 (ON SERVER) 之 DDL 陳述式的事件通知,需要伺服器的 CREATE DDL EVENT NOTIFICATION 權限。

若要建立追蹤事件的事件通知,需要伺服器的 CREATE TRACE EVENT NOTIFICATION 權限。

若要建立以佇列為範圍的事件通知,需要佇列的 ALTER 權限。

範例

注意

在底下的範例 A 和 B 中,TO SERVICE 'NotifyService' 子句 ('8140a771-3c4b-4479-8ac0-81008ab17984') 中的 GUID 是範例設定所在的電腦所特有。 在該實例中,這是 AdventureWorks2022 資料庫的 GUID。

若要複製及執行這些範例,您需要使用電腦和 SQL Server 執行個體中的 GUID 來取代這個 GUID。 如同上面的<引數>一節所說明,您可以透過查詢 sys.databases 目錄檢視的 service_broker_guid 資料行,以取得 'broker_instance_specifier'

A. 建立以伺服器為範圍的事件通知

以下範例會使用 Service Broker 建立設定目標服務所需要的物件。 目標服務會參考事件通知專用的起始服務之訊息類型和合約。 之後,每當 SQL Server 執行個體發生 Object_Created 追蹤事件時,都會在這個傳送通知的目標服務上建立一項事件通知。

--Create a queue to receive messages.  
CREATE QUEUE NotifyQueue ;  
GO  

--Create a service on the queue that references  
--the event notifications contract.  
CREATE SERVICE NotifyService  
ON QUEUE NotifyQueue  
([https://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);  
GO  

--Create a route on the service to define the address   
--to which Service Broker sends messages for the service.  
CREATE ROUTE NotifyRoute  
WITH SERVICE_NAME = 'NotifyService',  
ADDRESS = 'LOCAL';  
GO 

--Create the event notification.  
CREATE EVENT NOTIFICATION log_ddl1   
ON SERVER   
FOR Object_Created   
TO SERVICE 'NotifyService',  
    '8140a771-3c4b-4479-8ac0-81008ab17984' ;  

B. 建立以資料庫為範圍的事件通知

下列範例會在前一個範例的相同目標服務上,建立一項事件通知。 事件通知會在 AdventureWorks2022 範例資料庫發生事件之後 ALTER_TABLE 引發。

CREATE EVENT NOTIFICATION Notify_ALTER_T1  
ON DATABASE  
FOR ALTER_TABLE  
TO SERVICE 'NotifyService',  
    '8140a771-3c4b-4479-8ac0-81008ab17984';  

C. 取得以伺服器為範圍之事件通知的相關資訊

下列範例會查詢 sys.server_event_notifications 目錄檢視,來找出以伺服器為範圍建立之 log_ddl1 事件通知的中繼資料。

SELECT * FROM sys.server_event_notifications  
WHERE name = 'log_ddl1';  

D. 取得以資料庫為範圍之事件通知的相關資訊

下列範例會查詢 sys.event_notifications 目錄檢視,來找出以資料庫為範圍建立之 Notify_ALTER_T1 事件通知的中繼資料。

SELECT * FROM sys.event_notifications  
WHERE name = 'Notify_ALTER_T1';  

另請參閱

事件通知
DROP EVENT NOTIFICATION (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.event_notifications (Transact-SQL)
sys.server_event_notifications (Transact-SQL)
sys.events (Transact-SQL)
sys.server_events (Transact-SQL)