CREATE EVENT NOTIFICATION (Transact-SQL)
Crea un oggetto che invia a un servizio di Service Broker informazioni relative a un evento di un database o un server. Le notifiche degli eventi possono essere create solo mediante istruzioni Transact-SQL.
Sintassi
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' }
[ ; ]
Argomenti
event_notification_name
Nome della notifica degli eventi. I nomi delle notifiche degli eventi devono essere conformi alle regole per gli identificatori e devono essere univoci nell'ambito in cui vengono creati, ovvero SERVER, DATABASE o object_name.SERVER
Indica che l'ambito della notifica degli eventi corrisponde all'istanza corrente di SQL Server. Se viene specificato questo parametro, la notifica viene attivata ogni volta che l'evento specificato nella clausola FOR si verifica nell'ambito dell'istanza di SQL Server.DATABASE
Indica che l'ambito della notifica degli eventi corrisponde al database corrente. Se viene specificato questo parametro, la notifica viene attivata ogni volta che l'evento specificato nella clausola FOR si verifica nel database corrente.QUEUE
Indica che l'ambito della notifica corrisponde a una coda specifica nel database corrente. QUEUE può essere utilizzato solo se viene specificato anche FOR QUEUE_ACTIVATION o FOR BROKER_QUEUE_DISABLED.queue_name
Nome della coda a cui viene applicata la notifica degli eventi. queue_name può essere specificato solo se viene utilizzato QUEUE.WITH FAN_IN
Indica a SQL Server di inviare un solo messaggio per evento a qualsiasi servizio specificato per tutte le notifiche degli eventi che:Vengono create per lo stesso evento.
Vengono create dalla stessa entità, ovvero sono identificate dallo stesso SID.
Specificano lo stesso servizio e broker_instance_specifier.
Specificano WITH FAN_IN.
Se ad esempio vengono create tre notifiche degli eventi con FOR ALTER_TABLE, WITH FAN_IN, la stessa clausola TO SERVICE e lo stesso SID, quando viene eseguita un'istruzione ALTER TABLE i messaggi creati da queste tre notifiche degli eventi vengono uniti in un unico messaggio. Il servizio di destinazione riceve pertanto un solo messaggio dell'evento.
event_type
Nome di un tipo di evento che causa l'esecuzione della notifica degli eventi. event_type può essere un tipo di evento DDL di Transact-SQL, un tipo di evento di Traccia SQL o un tipo di evento di Service Broker. Per un elenco dei tipi di evento Transact-SQL DDL appropriati, vedere Eventi DDL. Per un elenco dei tipi di evento di Traccia SQL qualificati, vedere Eventi di traccia utilizzabili con le notifiche degli eventi. I tipi di evento di Service Broker sono QUEUE_ACTIVATION e BROKER_QUEUE_DISABLED. Per ulteriori informazioni, vedere Progettazione di notifiche degli eventi.event_group
Nome di un gruppo predefinito di tipi di evento Transact-SQL o di Traccia SQL. Una notifica degli eventi può essere attivata dopo l'esecuzione di un qualsiasi evento appartenente a un gruppo di eventi. Per un elenco dei gruppi di eventi DDL, gli eventi Transact-SQL in essi inclusi e l'ambito rispetto a cui vengono definiti, vedere Gruppi di eventi DDL. Per un elenco dei gruppi di eventi di traccia e gli eventi di traccia in essi inclusi, vedere Gruppi di eventi di traccia da utilizzare con le notifiche di eventi.event_group può anche essere utilizzato come macro, al termine dell'esecuzione dell'istruzione CREATE EVENT NOTIFICATION, che aggiunge i tipi di evento in esso inclusi nella vista del catalogo sys.events.
'broker_service'
Specifica il servizio di destinazione che riceve i dati dell'istanza dell'evento. SQL Server avvia una o più conversazioni con il servizio di destinazione per la notifica degli eventi. Questo servizio deve utilizzare lo stesso tipo di messaggio e lo stesso contratto per gli eventi di SQL Server applicati per l'invio del messaggio. Per ulteriori informazioni, vedere Creazione di servizi di Service Broker.Le conversazioni rimangono aperte fino a quando la notifica degli eventi non viene eliminata. Alcuni errori possono causare una terminazione anticipata delle conversazioni. Una terminazione esplicita di una parte delle conversazioni o di tutte le conversazioni può impedire al servizio di destinazione di ricevere ulteriori messaggi.
{ 'broker_instance_specifier' | 'current database' }
Specifica un'istanza di Service Broker in base a cui viene risolto l'argomento broker_service. Per ottenere il valore di un'istanza specifica di Service Broker, eseguire una query sulla colonna service_broker_guid della vista del catalogo sys.databases. Utilizzare 'current database' per specificare l'istanza di Service Broker nel database corrente. 'current database' è un valore letterale stringa senza distinzione tra maiuscole e minuscole.
Osservazioni
Service Broker prevede un tipo di messaggio e un contratto specifici per le notifiche degli eventi. Pertanto, essendo già disponibile un servizio di inizializzazione di Service Broker che specifica il nome di contratto https://schemas.microsoft.com/SQL/Notifications/PostEventNotification, non è necessario crearne uno.
Il servizio di destinazione che riceve le notifiche degli eventi deve rispettare il contratto esistente. Per ulteriori informazioni sulla creazione di servizi di destinazione di Service Broker, vedere Vantaggi della programmazione con Service Broker.
Importante |
---|
Per le notifiche degli eventi che inviano messaggi a Service Broker su un server remoto, è consigliabile configurare la protezione del dialogo di Service Broker. La protezione del dialogo deve essere configurata manualmente in base al modello di protezione avanzata. Per ulteriori informazioni, vedere Protezione del dialogo per le notifiche degli eventi. |
Se viene eseguito il rollback di una transazione di evento che attiva una notifica, verrà annullato anche l'invio della notifica degli eventi. Le notifiche degli eventi non vengono attivate da un'azione definita in un trigger quando viene eseguito il commit o il rollback della transazione all'interno del trigger. Poiché gli eventi di traccia non sono associati a transazioni, le notifiche degli eventi basate su eventi di traccia vengono inviate anche se viene eseguito il rollback della transazione da cui sono attivate.
Se la conversazione tra il server e il servizio di destinazione viene interrotta dopo l'attivazione di una notifica degli eventi, viene segnalata la presenza di un errore e la notifica degli eventi viene eliminata.
La transazione di evento che aveva avviato in origine la notifica non è influenzata dall'esito positivo o negativo della notifica degli eventi.
Gli errori che si verificano durante l'invio di una notifica degli eventi vengono registrati.
Autorizzazioni
Per creare una notifica degli eventi con ambito database (ON DATABASE), è necessario disporre dell'autorizzazione CREATE DATABASE DDL EVENT NOTIFICATION per il database corrente.
Per creare una notifica degli eventi per un'istruzione DDL con ambito server (ON SERVER), è necessario disporre dell'autorizzazione CREATE DDL EVENT NOTIFICATION nel server.
Per creare una notifica degli eventi per un evento di traccia, è necessario disporre dell'autorizzazione CREATE TRACE EVENT NOTIFICATION nel server.
Per creare una notifica degli eventi con ambito coda, è necessario disporre dell'autorizzazione ALTER per la coda.
Esempi
[!NOTA]
Negli Esempi A e B seguenti il GUID nella clausola TO SERVICE 'NotifyService' ('8140a771-3c4b-4479-8ac0-81008ab17984') è specifico del computer in cui è stato configurato l'esempio. Per tale istanza, su tratta del GUID per il database AdventureWorks.
Per copiare ed eseguire questi esempi, è necessario sostituire il GUID con quello del computer e dell'istanza di SQL Server in uso. Come illustrato nella sezione Argomenti precedente, è possibile acquisire 'broker_instance_specifier' eseguendo una query sulla colonna service_broker_guid della vista del catalogo sys.databases.
A. Creazione di una notifica degli eventi con ambito server
Nell'esempio seguente vengono creati gli oggetti necessari per la configurazione di un servizio di destinazione con Service Broker. Il servizio di destinazione fa riferimento al tipo di messaggio e al contratto del servizio di inizializzazione per le notifiche degli eventi, quindi viene creata una notifica degli eventi per tale servizio di destinazione che invia una notifica ogni volta che si verifica un evento di traccia Object_Created nell'istanza di SQL Server.
--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. Creazione di una notifica degli eventi con ambito database
Nell'esempio seguente viene creata una notifica degli eventi per lo stesso servizio di destinazione utilizzato nell'esempio precedente. La notifica degli eventi viene attivata dopo che si verifica un evento ALTER_TABLE nel database di esempio AdventureWorks.
CREATE EVENT NOTIFICATION Notify_ALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE 'NotifyService',
'8140a771-3c4b-4479-8ac0-81008ab17984';
C. Recupero di informazioni su una notifica degli eventi con ambito server
Nell'esempio seguente viene eseguita una query sulla vista del catalogo sys.server_event_notifications per recuperare metadati sulla notifica degli eventi log_ddl1 definita a livello di ambito del server.
SELECT * FROM sys.server_event_notifications
WHERE name = 'log_ddl1'
D. Recupero di informazioni su una notifica degli eventi con ambito database
Nell'esempio seguente viene eseguita una query sulla vista del catalogo sys.event_notifications per recuperare metadati sulla notifica degli eventi Notify_ALTER_T1 definita a livello di ambito del database.
SELECT * FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1'