共用方式為


建立事件通知 (Transact-SQL)

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

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

Transact-SQL 語法慣例

語法

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' }
[ ; ]

引數

event_notification_name

事件通知的名稱。 事件通知名稱必須符合識別碼的規則,而且在建立 識別碼 的範圍內必須是唯一的: SERVERDATABASEobject_name

SERVER

將事件通知範圍套用在目前的 SQL Server 執行個體上。 如果指定,每當子句中 FOR 指定的事件發生在 SQL Server 執行個體中的任何位置時,就會引發通知。

注意

此選項在自主資料庫中無法使用。

DATABASE

將事件通知範圍套用在目前資料庫上。 如果指定,則每當現行資料庫中發生子句中的 FOR 指定事件時,就會觸發通知。

QUEUE

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

queue_name

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

與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_ACTIVATIONBROKER_QUEUE_DISABLED。 如需詳細資訊,請參閱 事件通知

event_group

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

當陳述式完成時CREATE EVENT NOTIFICATION也會作為巨集,將它涵蓋的sys.events事件類型新增至型錄視圖。

broker_service

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

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

{ 'broker_instance_specifier' |'當前數據庫' }

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

注意

此選項在自主資料庫中無法使用。

備註

Service Broker 包含事件通知專用訊息類型和合約。 因此,不需要建立 Service Broker 起始服務,因為已經存在指定下列合約名稱的服務: http://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 是設定範例的電腦特有。 那次是 AdventureWorks2025 資料庫的 GUID。

若要複製及執行這些範例,您需要使用電腦和 SQL Server 執行個體中的 GUID 來取代這個 GUID。 如引數一節所述,您可以查詢目錄檢視的service_broker_guid欄來取得「sys.databases」。

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 ([http://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. 建立資料庫範圍的事件通知

下列範例會在前一個範例的相同目標服務上,建立一項事件通知。 活動通知會在 AdventureWorks2025 範例資料庫中發生 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';