Condividi tramite


CREATE EVENT NOTIFICATION (Transact-SQL)

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Crea un oggetto che invia informazioni su un evento di database o server a un servizio Service Broker. Le notifiche degli eventi possono essere create solo mediante istruzioni Transact-SQL.

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

Argomenti

event_notification_name

Nome della notifica dell'evento. Un nome di notifica eventi deve essere conforme alle regole per gli identificatori e deve essere univoco all'interno dell'ambito in cui vengono creati: SERVER, DATABASEo object_name.

SERVER

Indica che l'ambito della notifica degli eventi corrisponde all'istanza corrente di SQL Server. Se specificato, la notifica viene attivata ogni volta che si verifica l'evento specificato nella clausola in FOR qualsiasi punto 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 specificato, la notifica viene attivata ogni volta che si verifica l'evento specificato nella FOR clausola nel database corrente.

QUEUE

Indica che l'ambito della notifica corrisponde a una coda specifica nel database corrente. QUEUE può essere specificato solo se FOR QUEUE_ACTIVATION o FOR BROKER_QUEUE_DISABLED è specificato anche.

queue_name

Nome della coda a cui si applica la notifica dell'evento. queue_name può essere specificato solo se QUEUE specificato.

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.
  • Specificare WITH FAN_IN.

Se ad esempio vengono create tre notifiche degli eventi Tutte le notifiche degli eventi specificano FOR ALTER_TABLE, WITH FAN_IN, la stessa TO SERVICE clausola e vengono create dallo stesso SID. Quando viene eseguita un'istruzione ALTER TABLE , i messaggi creati da queste tre notifiche degli eventi vengono uniti in uno. Il servizio di destinazione riceve pertanto un solo messaggio dell'evento.

event_type

Nome di un tipo di evento che determina 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 Notifiche degli eventi.

event_group

Nome di un gruppo predefinito di tipi di eventi di Transact-SQL o 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 funge anche da macro, al termine dell'istruzione CREATE EVENT NOTIFICATION , aggiungendo i tipi di evento coperti alla vista del sys.events catalogo.

'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. Il valore di un service broker specifico può essere acquisito eseguendo una query sulla service_broker_guid colonna della vista del sys.databases catalogo. 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.

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, non è necessario creare un servizio di avvio di Service Broker perché ne esiste già uno che specifica il nome del contratto seguente: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

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 dalle transazioni, le notifiche degli eventi in base agli eventi di traccia vengono inviate indipendentemente dal fatto che venga eseguito il rollback della transazione che li attiva.

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 evento che ha originariamente avviato la notifica non è influenzata dall'esito positivo o negativo dell'invio della notifica dell'evento.

Gli errori che si verificano durante l'invio di una notifica degli eventi vengono registrati.

Autorizzazioni

Per creare una notifica degli eventi con ambito per il database (ON DATABASE), è necessaria CREATE DATABASE DDL EVENT NOTIFICATION l'autorizzazione nel database corrente.

Per creare una notifica degli eventi in un'istruzione DDL con ambito al server (ON SERVER), è necessaria CREATE DDL EVENT NOTIFICATION l'autorizzazione nel server.

Per creare una notifica degli eventi in un evento di traccia, è necessaria CREATE TRACE EVENT NOTIFICATION l'autorizzazione nel server.

Per creare una notifica degli eventi con ambito in una coda, è necessaria ALTER l'autorizzazione per la coda.

Esempi

Nota

Negli esempi A e B il GUID nella TO SERVICE 'NotifyService' clausola (8140a771-3c4b-4479-8ac0-81008ab17984) è specifico del computer in cui è stato configurato l'esempio. Ad esempio, 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 , è possibile acquisire la "broker_instance_specifier" eseguendo una query sulla service_broker_guid colonna della vista del sys.databases catalogo.

R. Creare 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 ([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. Creare 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. Ottenere 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. Ottenere 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';