CREATE EVENT NOTIFICATION (Transact-SQL)

Gilt für:SQL ServerAzure SQL Managed Instance

Erstellt ein Objekt, das Informationen über eine Datenbank oder ein Serverereignis an einen Service Broker-Dienst sendet. Ereignisbenachrichtigungen werden nur mithilfe von Transact-SQL-Anweisungen erstellt.

Transact-SQL-Syntaxkonventionen

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

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

event_notification_name
Der Name der Ereignisbenachrichtigung. Der Name der Ereignisbenachrichtigung muss den Regeln für Bezeichner entsprechen und innerhalb seines Bereichs (SERVER, DATABASE oder object_name) eindeutig sein.

SERVER
Wendet den Bereich der Ereignisbenachrichtigung auf die aktuelle Instanz von SQL Server an. Ist dieser Bereich angegeben, wird die Benachrichtigung jedes Mal ausgelöst, wenn das angegebene Ereignis an beliebiger Stelle in der Instanz von SQL Server in der FOR-Klausel auftritt.

Hinweis

Diese Option ist in einer enthaltenen Datenbank nicht verfügbar.

DATABASE
Wendet den Bereich der Ereignisbenachrichtigung auf die aktuelle Datenbank an. Ist dieser Bereich angegeben, wird die Benachrichtigung jedes Mal ausgelöst, wenn das angegebene Ereignis in der FOR-Klausel in der aktuellen Datenbank auftritt.

QUEUE
Wendet den Bereich der Benachrichtigung auf eine bestimmte Warteschlange in der aktuellen Datenbank an. QUEUE kann nur angegeben werden, wenn auch FOR QUEUE_ACTIVATION oder FOR BROKER_QUEUE_DISABLED angegeben ist.

queue_name
Der Name der Warteschlange, auf die die Ereignisbenachrichtigung angewendet wird. queue_name kann nur angegeben werden, wenn QUEUE angegeben wird.

WITH FAN_IN
Weist SQL Server an, nur eine Nachricht pro Ereignis an einen beliebigen angegebenen Dienst zu senden, wenn für Ereignisbenachrichtigungen Folgendes gilt:

  • Sie werden für dasselbe Ereignis erstellt.

  • Sie werden vom selben Prinzipal erstellt (erkennbar an der identischen Sicherheits-ID).

  • Geben Sie denselben Dienst und broker_instance_specifier-Bezeichner an.

  • Sie geben WITH FAN_IN an.

Beispielsweise werden drei Ereignisbenachrichtigungen erstellt. Bei allen Ereignisbenachrichtigungen wird FOR ALTER_TABLE, WITH FAN_IN und dieselbe TO SERVICE-Klausel angegeben, und alle werden von derselben SID erstellt. Wenn eine ALTER TABLE-Anweisung ausgeführt wird, werden die durch diese drei Ereignisbenachrichtigungen erstellten Nachrichten in eine Nachricht zusammengeführt. Daher empfängt der Zieldienst nur eine Nachricht bezüglich des Ereignisses.

event_type
Der Name eines Ereignistyps, der die Ausführung der Ereignisbenachrichtigung verursacht. event_type kann ein Transact-SQL-DDL-Ereignistyp, ein SQL-Ablaufverfolgungsereignistyp oder ein Service Broker-Ereignistyp sein. Eine Liste aller qualifizierenden Transact-SQL-DDL-Ereignistypen finden Sie unter DDL-Ereignisse. Service Broker-Ereignistypen sind QUEUE_ACTIVATION und BROKER_QUEUE_DISABLED. Weitere Informationen finden Sie unter Event Notifications.

event_group
Der Name einer vordefinierten Gruppe von Transact-SQL- oder SQL-Ablaufverfolgungs-Ereignistypen. Eine Ereignisbenachrichtigung kann nach der Ausführung eines beliebigen Ereignisses ausgelöst werden, das zu einer Ereignisgruppe gehört. Eine Liste der DDL-Ereignisgruppen, der von diesen abgedeckten Transact-SQL-Ereignisse und der Bereiche, für die sie definiert werden können, finden Sie unter DDL-Ereignisgruppen.

event_group fungiert außerdem als Makro, indem dieser Parameter beim Abschließen der CREATE EVENT NOTIFICATION-Anweisung die betroffenen Ereignistypen der sys.events-Katalogsicht hinzufügt.

'Brokerdienst'
Gibt den Zieldienst an, der die Ereignisinstanzdaten empfängt. SQL Server öffnet eine oder mehrere Konversationen für den Zieldienst der Ereignisbenachrichtigung. Der Dienst muss denselben SQL Server-Ereignismeldungstyp und Vertrag berücksichtigen, wie sie zum Senden der Nachricht verwendet werden.

Die Konversationen bleiben geöffnet, bis die Ereignisbenachrichtigung gelöscht wird. Bestimmte Fehler können dazu führen, dass Konversationen früher geschlossen werden. Das explizite Beenden einiger oder aller Konversationen kann verhindern, dass der Zieldienst weitere Nachrichten empfängt.

{ 'broker_instance_specifier' | 'current database' }
Gibt die Service Broker-Instanz an, für die broker_service aufgelöst wird. Der Wert für einen bestimmten Service Broker kann durch Abfragen der service_broker_guid-Spalte der sys.databases-Katalogsicht ermittelt werden. Verwenden Sie 'current database', um die Service Broker-Instanz in der aktuellen Datenbank anzugeben. 'current database' ist ein Zeichenfolgenliteral, das nicht nach Groß-/Kleinschreibung unterscheidet.

Hinweis

Diese Option ist in einer enthaltenen Datenbank nicht verfügbar.

Bemerkungen

Service Broker beinhaltet einen speziellen Nachrichtentyp und Vertrag für Ereignisbenachrichtigungen. Es muss also kein initiierender Dienst für Service Broker erstellt werden; dieser ist bereits vorhanden und gibt den folgenden Vertragsnamen an: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

Der Zieldienst, der Ereignisbenachrichtigungen empfängt, muss diesen bereits vorhandenen Vertrag berücksichtigen.

Wichtig

Service Broker -Dialogsicherheit sollte für Ereignisbenachrichtigungen konfiguriert werden, die Meldungen an einen Service Broker auf einem Remoteserver senden. Die Dialogsicherheit muss manuell entsprechend dem Modell der vollständigen Sicherheit konfiguriert werden. Weitere Informationen finden Sie unter Konfigurieren der Dialogsicherheit für Ereignisbenachrichtigungen.

Wird für eine Ereignistransaktion, die eine Benachrichtigung aktiviert, ein Rollback ausgeführt, wird das Rollback auch für das Senden der Ereignisbenachrichtigung ausgeführt. Benachrichtigungen werden nicht durch eine in einem Trigger definierte Aktion ausgelöst, wenn ein Commit oder Rollback der Transaktion im Trigger ausgeführt wird. Da Ablaufverfolgungsereignisse nicht durch Transaktionen gebunden werden, werden auf Ablaufverfolgungsereignissen basierende Ereignisbenachrichtigungen unabhängig davon gesendet, ob für die Transaktion, durch die sie aktiviert werden, ein Rollback ausgeführt wird.

Wird die Konversation zwischen Server und Zieldienst nach dem Auslösen einer Ereignisbenachrichtigung unterbrochen, wird ein Fehler gemeldet und die Ereignisbenachrichtigung gelöscht.

Die Ereignistransaktion, von der die Benachrichtigung ursprünglich gestartet wurde, wird nicht davon betroffen, ob die Ereignisbenachrichtigung erfolgreich gesendet wurde.

Alle Fehler beim Senden einer Ereignisbenachrichtigung werden protokolliert.

Berechtigungen

Zum Erstellen einer Ereignisbenachrichtigung mit der Datenbank als Bereich (ON DATABASE) ist die CREATE DATABASE DDL EVENT NOTIFICATION-Berechtigung in der aktuellen Datenbank erforderlich.

Zum Erstellen einer Ereignisbenachrichtigung für eine DDL-Anweisung mit dem Server als Bereich (ON SERVER) ist die CREATE DDL EVENT NOTIFICATION-Berechtigung auf dem Server erforderlich.

Zum Erstellen einer Ereignisbenachrichtigung für ein Ablaufverfolgungsereignis ist die CREATE TRACE EVENT NOTIFICATION-Berechtigung auf dem Server erforderlich.

Zum Erstellen einer Ereignisbenachrichtigung mit einer Warteschlange als Bereich ist die ALTER-Berechtigung für die Warteschlange erforderlich.

Beispiele

Hinweis

In den nachfolgenden Beispielen A und B entspricht der GUID in der TO SERVICE 'NotifyService'-Klausel ('8140a771-3c4b-4479-8ac0-81008ab17984') dem Computer, auf dem das Beispiel eingerichtet wurde. Für diese Instanz handelt es sich dabei um die GUID für die AdventureWorks2022-Datenbank.

Zum Kopieren und Ausführen dieser Beispiele müssen Sie diese GUID durch eine GUID von Ihrem Computer und Ihrer SQL Server-Instanz ersetzen. Wie im obigen Abschnitt zu den Argumenten erläutert, kann 'broker_instance_specifier' durch Abfragen der service_broker_guid-Spalte der sys.databases-Katalogsicht ermittelt werden.

A. Erstellen einer Ereignisbenachrichtigung mit dem Server als Bereich

Im folgenden Beispiel werden die zum Einrichten eines Zieldiensts mit Service Broker erforderlichen Objekte erstellt. Der Zieldienst verweist auf den Nachrichtentyp und den Vertrag des initiierenden Diensts speziell für Ereignisbenachrichtigungen. Dann wird auf dem Zieldienst eine Ereignisbenachrichtigung erstellt, die eine Benachrichtigung sendet, sobald ein Object_Created-Ablaufverfolgungsereignis auf der Instanz von SQL Server vorliegt.

--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. Erstellen einer Ereignisbenachrichtigung mit der Datenbank als Bereich

Im folgenden Beispiel wird eine Ereignisbenachrichtigung für denselben Zieldienst wie im vorherigen Beispiel erstellt. Die Ereignisbenachrichtigung wird ausgelöst, nachdem ein ALTER_TABLE-Ereignis in der AdventureWorks2022-Beispieldatenbank aufgetreten ist.

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

C. Abrufen von Informationen zu einer Ereignisbenachrichtigung mit dem Server als Bereich

Im folgenden Beispiel wird die sys.server_event_notifications-Katalogsicht für Metadaten zur Ereignisbenachrichtigung log_ddl1 abgefragt, die mit dem Serverbereich erstellt wurde.

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

D: Abrufen von Informationen zu einer Ereignisbenachrichtigung mit der Datenbank als Bereich

Im folgenden Beispiel wird die sys.event_notifications-Katalogsicht für Metadaten zur Ereignisbenachrichtigung Notify_ALTER_T1 abgefragt, die mit dem Datenbankbereich erstellt wurde.

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

Weitere Informationen

Ereignisbenachrichtigungen
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)