CREATE EVENT NOTIFICATION (Transact-SQL)

Si applica a:SQL Server Istanza gestita di SQL di Azure

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.

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

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.

Nota

Questa opzione non è disponibile in un database indipendente.

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 applicare la notifica degli eventi. queue_name può essere specificato solo se è specificato 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 mediante il quale è stata causata l'esecuzione della notifica degli eventi. event_typepuò 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 DDL di Transact-SQL appropriati, vedere Eventi DDL. I tipi di evento di Service Broker sono QUEUE_ACTIVATION e BROKER_QUEUE_DISABLED. Per altre informazioni, vedere Event Notifications.

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, degli eventi Transact-SQL inclusi e degli ambiti in cui possono essere definiti, vedere Gruppi di eventi DDL.

event_group può anche essere usato come macro, al termine dell'esecuzione dell'istruzione CREATE EVENT NOTIFICATION, tramite l'aggiunta dei tipi di evento inclusi nella vista del catalogo sys.events.

'broker_service'
Viene specificato il servizio di destinazione tramite cui vengono ricevuti i dati dell'istanza dell'evento. In SQL Server vengono avviate 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.

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 alla quale 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. Usare 'current database' per specificare l'istanza di Service Broker nel database corrente. 'current database' è un valore letterale stringa senza distinzione tra maiuscole e minuscole.

Nota

Questa opzione non è disponibile in un database indipendente.

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.

Importante

È consigliabile configurare la sicurezza del dialogo di Service Broker per le notifiche degli eventi che prevedono l'invio di messaggi a Service Broker su un server remoto. La sicurezza del dialogo deve essere configurata manualmente in base al modello di sicurezza avanzata. Per altre informazioni, vedere Configurare la sicurezza 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, si tratta del GUID per il database AdventureWorks2022.

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.

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

B. 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 ALTER_TABLE evento nel database di esempio AdventureWorks2022.

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

Vedi anche

Notifiche degli eventi
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)