CREATE EVENT NOTIFICATION (Transact-SQL)
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.
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. 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 in der FOR-Klausel irgendwo in der Instanz von SQL Server auftritt.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, für die die Ereignisbenachrichtigung gilt. queue_name kann nur angegeben werden, wenn QUEUE angegeben ist.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).
Sie geben denselben Dienst und broker_instance_specifier 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 das Ausführen der Ereignisbenachrichtigung verursacht. event_type kann vom Typ Transact-SQL-DDL-Ereignis, SQL-Ablaufverfolgungsereignis oder Service Broker-Ereignis sein. Eine Liste aller qualifizierenden Transact-SQL-DDL-Ereignistypen finden Sie unter DDL-Ereignisse. Eine Liste aller qualifizierenden SQL-Ablaufverfolgungs-Ereignistypen finden Sie unter Ablaufverfolgungsereignisse für die Verwendung mit Ereignisbenachrichtigungen. Die Service Broker-Ereignistypen sind QUEUE_ACTIVATION und BROKER_QUEUE_DISABLED. Weitere Informationen finden Sie unter Entwerfen von Ereignisbenachrichtigungen.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 ihnen abgedeckten Transact-SQL-Ereignisse und der Bereiche, für die sie definiert werden können, finden Sie unter DDL-Ereignisgruppen. Eine Liste von Ablaufverfolgungs-Ereignisgruppen und der von ihnen abgedeckten Ablaufverfolgungsereignisse finden Sie unter Ablaufverfolgungsereignisgruppen zum Verwenden mit Ereignisbenachrichtigungen.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.
'broker_service'
Gibt den Zieldienst an, der die Ereignisinstanzdaten erhält. SQL Server öffnet eine oder mehrere Konversationen mit dem Zieldienst für die Ereignisbenachrichtigung. Der Dienst muss denselben SQL Server-Ereignismeldungstyp und Vertrag berücksichtigen, wie sie zum Senden der Nachricht verwendet werden. Weitere Informationen finden Sie unter Erstellen von Service Broker-Diensten.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.
Hinweise
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. Weitere Informationen zum Erstellen von Service Broker-Zieldiensten finden Sie unter Vorteile der Programmierung mit Service Broker.
Wichtig |
---|
Für Ereignisbenachrichtigungen, die Nachrichten an eine Service Broker-Instanz auf einem Remoteserver senden, sollte die Dialogsicherheit von Service Broker konfiguriert werden. Die Dialogsicherheit muss manuell entsprechend dem Modell der vollständigen Sicherheit konfiguriert werden. Weitere Informationen finden Sie unter 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 den GUID für die AdventureWorks2008R2-Datenbank. Zum Kopieren und Ausführen dieser Beispiele müssen Sie diesen GUID durch einen 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' ;
A. 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 AdventureWorks2008R2-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'
C. 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'
Siehe auch