Condividi tramite


Notifiche degli eventi

Si applica a:SQL Server

Le notifiche degli eventi inviano informazioni sugli eventi a un servizio di Service Broker. Le notifiche degli eventi vengono eseguite in risposta a una serie di istruzioni DDL (Data Definition Language) Transact-SQL ed eventi di Traccia SQL e inviano informazioni su tali eventi a un servizio di Service Broker.

È possibile utilizzare le notifiche degli eventi per eseguire le attività seguenti:

  • Registrare e visualizzare le modifiche o le attività riscontrate sul database.
  • Eseguire un'operazione in risposta a un evento in modo asincrono anziché sincrono.

Le notifiche degli eventi possono costituire un'alternativa a trigger DDL e Traccia SQL a livello di programmazione.

Vantaggi delle notifiche degli eventi

Le notifiche degli eventi vengono eseguite in modo asincrono, all'esterno dell'ambito di una transazione. A differenza dei trigger DDL, è pertanto possibile utilizzare le notifiche degli eventi all'interno di un'applicazione di database per rispondere a eventi senza utilizzare le risorse definite dalla transazione immediata.

A differenza della Traccia SQL, è possibile usare le notifiche degli eventi per eseguire un'operazione all'interno di un'istanza di SQL Server in risposta a un evento di Traccia SQL.

I dati degli eventi possono essere usati in applicazioni eseguite assieme a SQL Server per tracciare l’avanzamento e prendere decisioni. La notifica degli eventi seguente, ad esempio, invia un avviso a un determinato servizio ogni volta che viene eseguita un'istruzione ALTER TABLE nel database di esempio AdventureWorks2025 .

USE AdventureWorks2022;
GO

CREATE EVENT NOTIFICATION NotifyALTER_T1
    ON DATABASE
    FOR ALTER_TABLE
    TO SERVICE '//Adventure-Works.com/ArchiveService',
        '8140a771-3c4b-4479-8ac0-81008ab17984';

Concetti relativi alle notifiche degli eventi

Durante la creazione di una notifica degli eventi, vengono aperte una o più conversazioni di Service Broker tra un'istanza di SQL Server e il servizio di destinazione specificato. Tali conversazioni rimangono in genere aperte finché la notifica degli eventi è disponibile come oggetto nell'istanza del server. In alcune situazioni di errore è possibile che le conversazioni vengano chiuse prima dell'eliminazione della notifica. Le conversazioni non vengono mai condivise tra le notifiche degli eventi. A ogni notifica sono associate conversazioni esclusive. Se una conversazione viene terminata in modo esplicito, il servizio di destinazione non potrà più ricevere altri messaggi e la conversazione non verrà riaperta alla successiva attivazione della notifica degli eventi.

Le informazioni sugli eventi vengono fornite al servizio di Service Broker come variabile di tipo xml, che fornisce informazioni relative al momento in cui si verifica l'evento, all'oggetto di database interessato, all'istruzione batch Transact-SQL, nonché altre informazioni. Per altre informazioni sull'XML Schema generato dalle notifiche degli eventi, vedere EVENTDATA.

Notifiche degli eventi e trigger

Nella tabella seguente viene eseguito il confronto fra trigger e notifiche di eventi.

Trigger Notifiche degli eventi
I trigger DML rispondono agli eventi DML (Data Manipulation Language). I trigger DLL rispondono agli eventi DLL (Data Definition Language). Le notifiche degli eventi rispondono agli eventi DDL e a un subset di eventi di Traccia SQL.
I trigger possono eseguire codice gestito Transact-SQL o CLR (Common Language Runtime). Le notifiche degli eventi non eseguono codice. ma inviano messaggi xml a un servizio di Service Broker.
I trigger vengono elaborati in modo sincrono nell'ambito delle transazioni che ne provocano l'attivazione. Le notifiche degli eventi possono essere elaborate in modo asincrono e non vengono eseguite nell'ambito delle transazioni che ne causano l'attivazione.
Il consumer di un trigger è strettamente associato all'evento che lo attiva. Il consumer di una notifica degli eventi non è associato all'evento che la attiva.
I trigger devono essere elaborati nel server locale. Le notifiche degli eventi possono essere elaborate in un server remoto.
Il rollback dei trigger è possibile. Non è possibile eseguire il rollback delle notifiche degli eventi.
I nomi di trigger DML sono definiti a livello di ambito dello schema. L'ambito dei nomi dei trigger DDL è il server o il database. L'ambito dei nomi delle notifiche degli eventi è il server o il database. Le notifiche degli eventi in un evento QUEUE_ACTIVATION sono definiti a livello di ambito di una coda specifica.
Il proprietario dei trigger DML è il proprietario delle tabelle sulle quali vengono applicati. Il proprietario di una notifica di evento in una coda potrebbe avere un proprietario diverso rispetto all'oggetto in cui viene applicato.
I trigger supportano la EXECUTE AS clausola . Le notifiche degli eventi non supportano la EXECUTE AS clausola .
Le informazioni sull'evento di un trigger DDL possono essere acquisite usando la funzione EVENTDATA, che restituisce un tipo di dati xml . Le notifiche degli eventi inviano informazioni xml sull'evento a un servizio di Service Broker. Le informazioni vengono formattate con lo stesso schema della funzione EVENTDATA.
I metadati relativi ai trigger sono disponibili nelle viste del sys.triggers catalogo e sys.server_triggers . I metadati relativi alle notifiche degli eventi sono disponibili nelle viste del sys.event_notifications catalogo e sys.server_event_notifications .

Notifiche degli eventi vs. SQL Traccia

Nella tabella seguente vengono confrontate le caratteristiche delle notifiche degli eventi e della Traccia SQL per il monitoraggio degli eventi del server.

Traccia SQL Notifiche degli eventi
In Traccia SQL non viene generato alcun overhead di prestazioni associato alle transazioni. L'assemblaggio dei dati risulta efficace. Si verifica un sovraccarico delle prestazioni associato alla creazione dei dati dell'evento in formato XML e all'invio della notifica dell'evento.
In Traccia SQL viene eseguito il monitoraggio di qualsiasi classe di evento di traccia. Le notifiche degli eventi consentono di eseguire il monitoraggio di un subset di classi di evento di traccia, nonché di tutti gli eventi Data Definition Language (DDL).
È possibile personalizzare le colonne di dati da generare in un evento di traccia. Lo schema dei dati di evento in formato XML restituiti dalle notifiche degli eventi è fisso.
Gli eventi di traccia restituiti da DDL vengono sempre generati senza tener conto dell'eventuale rollback dell'istruzione DDL. Le notifiche degli eventi non vengono attivate se viene eseguito il rollback dell'evento nell'istruzione DDL corrispondente.
La gestione del flusso intermedio dei dati degli eventi di traccia comporta il popolamento e la gestione dei file o delle tabelle di traccia. La gestione intermedia dei dati relativi alle notifiche degli eventi viene eseguita automaticamente tramite code Service Broker.
Le tracce devono essere riavviate a ogni riavvio del server. Dopo la registrazione, le notifiche degli eventi vengono mantenute anche in caso di riavvio del server e incluse nelle transazioni.
Dopo l'avvio, l'attivazione delle tracce non può essere controllata. È possibile utilizzare orari di arresto e di filtro per specificare l'ora di avvio. Per accedere alle tracce, è necessario eseguire il polling del file di traccia corrispondente. Le notifiche degli eventi possono essere controllate usando l'istruzione WAITFOR sulla coda che riceve il messaggio generato dalla notifica dell'evento. Per accedere alle notifiche, è possibile eseguire il polling della coda.
ALTER TRACE è l'autorizzazione minima necessaria per creare una traccia. È inoltre necessario disporre di un'autorizzazione per creare un file di traccia nel computer corrispondente. L'autorizzazione minima dipende dal tipo di notifica degli eventi da creare. RECEIVE è necessaria anche l'autorizzazione per la coda corrispondente.
Le tracce possono essere ricevute in remoto. Le notifiche degli eventi possono essere ricevute in remoto.
Per l'implementazione di eventi di traccia vengono utilizzate stored procedure di sistema. Le notifiche degli eventi vengono implementate usando una combinazione di istruzioni Transact-SQL del motore di database e di Service Broker.
Per accedere programmaticamente ai dati degli eventi di traccia, eseguire una query nella tabella di traccia corrispondente, analizzare il file di traccia oppure usare la classe TraceReader di SQL Server Management Objects (SMO). Per accedere ai dati degli eventi a livello di programmazione, è possibile eseguire XQuery sui dati degli eventi in formato XML oppure utilizzare le classi di evento di SMO.

Attività di notifica degli eventi

Attività Article
Viene descritto come creare e implementare notifiche degli eventi. Implementazione di notifiche degli eventi
Spiega come configurare la sicurezza del dialogo di Service Broker per le notifiche degli eventi che inviano messaggi a un’istanza di Service Broker su un server remoto. Configurazione della sicurezza del dialogo per le notifiche degli eventi
Viene descritto come restituire informazioni sulle notifiche degli eventi. Recupero di informazioni sulle notifiche degli eventi