Freigeben über


EREIGNISBENACHRICHTIGUNG ERSTELLEN (Transact-SQL)

Gilt für:SQL ServerAzure SQL Managed Instance

Erstellt ein Objekt, das Informationen zu einer Datenbank oder einem 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' }
[ ; ]

Argumente

event_notification_name

Der Name der Ereignisbenachrichtigung. Ein Ereignisbenachrichtigungsname muss die Regeln für Bezeichner erfüllen und innerhalb des Bereichs, in dem sie erstellt werden, eindeutig sein: SERVER, , DATABASEoder object_name.

SERVER

Wendet den Bereich der Ereignisbenachrichtigung auf die aktuelle Instanz von SQL Server an. Wenn angegeben, wird die Benachrichtigung ausgelöst, wenn das angegebene Ereignis in der FOR Klausel an einer beliebigen Stelle in der Instanz von SQL Server auftritt.

Hinweis

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

DATABASE

Wendet den Bereich der Ereignisbenachrichtigung auf die aktuelle Datenbank an. Wenn angegeben, wird die Benachrichtigung 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 FOR QUEUE_ACTIVATION oder FOR BROKER_QUEUE_DISABLED auch angegeben wird.

queue_name

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

MIT 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.
  • Geben Sie WITH FAN_IN an.

Beispielsweise werden drei Ereignisbenachrichtigungen erstellt. Alle Ereignisbenachrichtigungen geben FOR ALTER_TABLE, WITH FAN_INdie gleiche TO SERVICE Klausel und werden von derselben SID erstellt. Wenn eine ALTER TABLE Anweisung ausgeführt wird, werden die nachrichten, die von diesen drei Ereignisbenachrichtigungen erstellt werden, in einer zusammengeführt. Daher empfängt der Zieldienst nur eine Nachricht bezüglich des Ereignisses.

event_type

Der Name eines Ereignistyps, der bewirkt, dass die Ereignisbenachrichtigung ausgeführt wird. 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 Ereignisbenachrichtigungen.

event_group

Der Name einer vordefinierten Gruppe von Transact-SQL- oder SQL Trace-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 auch als Makro, wenn die CREATE EVENT NOTIFICATION Anweisung beendet ist, indem sie die Ereignistypen hinzufügt, die sie der sys.events Katalogansicht abdeckt.

"broker_service"

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' | 'Aktuelle Datenbank' }

Gibt die Service Broker-Instanz an, für die broker_service aufgelöst wird. Der Wert für einen bestimmten Dienstbroker kann durch Abfragen der service_broker_guid Spalte der sys.databases Katalogansicht abgerufen werden. Wird verwendet 'current database' , um die Dienstbrokerinstanz in der aktuellen Datenbank anzugeben. 'current database' ist ein Zeichenfolgenliteral mit Groß-/Kleinschreibung.

Hinweis

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

Bemerkungen

Service Broker beinhaltet einen speziellen Nachrichtentyp und Vertrag für Ereignisbenachrichtigungen. Daher muss kein Dienstbroker erstellt werden, da bereits ein Dienst vorhanden ist, der den folgenden Vertragsnamen angibt: http://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. Ereignisbenachrichtigungen werden nicht durch eine aktion ausgelöst, die in einem Trigger definiert ist, wenn die Transaktion zugesichert oder innerhalb des Triggers zurückgesetzt wird. Da Ablaufverfolgungsereignisse nicht an Transaktionen gebunden sind, werden Ereignisbenachrichtigungen basierend auf Ablaufverfolgungsereignissen gesendet, unabhängig davon, ob die Transaktion, die sie aktiviert, zurückgesetzt 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, die die Benachrichtigung ursprünglich gestartet hat, ist nicht vom Erfolg oder Fehler des Sendens der Ereignisbenachrichtigung betroffen.

Alle Fehler beim Senden einer Ereignisbenachrichtigung werden protokolliert.

Berechtigungen

Zum Erstellen einer Ereignisbenachrichtigung, die für die DatenbankON DATABASE () gilt, ist die Berechtigung in der aktuellen Datenbank erforderlich CREATE DATABASE DDL EVENT NOTIFICATION .

Zum Erstellen einer Ereignisbenachrichtigung für eine DDL-Anweisung, die auf den Server () angewendet wird, ist eine Berechtigung auf dem ServerON SERVER erforderlich CREATE DDL EVENT NOTIFICATION .

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

Zum Erstellen einer Ereignisbenachrichtigung, die auf eine Warteschlange festgelegt ist, ist die Berechtigung für die Warteschlange erforderlich ALTER .

Beispiele

Hinweis

In Beispielen A und B ist die GUID in der TO SERVICE 'NotifyService' Klausel (8140a771-3c4b-4479-8ac0-81008ab17984) spezifisch für den Computer, auf dem das Beispiel eingerichtet wurde. In diesem Fall war es der GUID für die AdventureWorks2025-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 Abschnitt "Argumente " erläutert, können Sie die "broker_instance_specifier" abrufen, indem Sie die service_broker_guid Spalte der sys.databases Katalogansicht abfragen.

A. Erstellen einer Ereignisbenachrichtigung mit Serverbereich

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 ([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. Erstellen einer Ereignisbenachrichtigung mit Datenbankbereich

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 AdventureWorks2025-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, für die der Serverbereich gilt

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 Datenbankbereich

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';