Notifiche degli eventi
Le notifiche degli eventi inviano informazioni sugli eventi a un servizio di Service Broker. Le notifiche degli eventi vengono eseguite in risposta a un'ampia gamma di istruzioni DDL (Data Definition Language) Transact-SQL e eventi di traccia SQL inviando informazioni su questi 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 di 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 di Traccia SQL, le notifiche degli eventi possono essere usate per eseguire un'azione all'interno di un'istanza di SQL Server in risposta a un evento di traccia SQL.
I dati degli eventi possono essere usati dalle applicazioni in esecuzione insieme a SQL Server per tenere traccia dello stato di avanzamento e prendere decisioni. Ad esempio, la notifica di evento seguente invia un avviso a un determinato servizio ogni volta che viene emessa un'istruzione ALTER TABLE
nel database di esempio AdventureWorks2012 .
USE AdventureWorks2012;
GO
CREATE EVENT NOTIFICATION NotifyALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE '//Adventure-Works.com/ArchiveService' ,
'8140a771-3c4b-4479-8ac0-81008ab17984';
Concetti delle notifiche di eventi
Quando viene creata 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 recapitate al servizio Service Broker come variabile di tipo xml
che fornisce informazioni su quando si verifica un evento, sull'oggetto di database interessato, sull'istruzione batch Transact-SQL coinvolta e su altre informazioni. Per altre informazioni sull'XML Schema prodotto dalle notifiche degli eventi, vedere EVENTDATA (Transact-SQL).
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, In alternativa, inviano xml messaggi 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 le attivano. |
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. | Il rollback delle notifiche degli eventi non è possibile. |
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 degli eventi in una coda può essere diverso dal proprietario dell'oggetto al quale viene applicata. |
I trigger supportano la clausola EXECUTE AS. | Le notifiche degli eventi non supportano la clausola EXECUTE AS. |
Le informazioni sull'evento trigger DDL possono essere acquisite usando la funzione EVENTDATA, che restituisce un xml tipo di dati. |
Le notifiche degli eventi inviano xml informazioni sugli eventi a un servizio Service Broker. Le informazioni vengono formattate con lo stesso schema della funzione EVENTDATA. |
I metadati relativi ai trigger si trovano nelle viste del catalogo sys.triggers e sys.server_triggers . | I metadati relativi alle notifiche degli eventi si trovano nelle viste del catalogo sys.event_notifications e sys.server_event_notifications . |
Notifiche degli eventi e Traccia SQL
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. | La creazione di dati di evento in formato XML e l'invio della notifica degli eventi comportano invece un certo overhead. |
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 in caso di 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, non è possibile controllare l'attivazione delle tracce. È 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. | È possibile controllare le notifiche degli eventi eseguendo l'istruzione WAITFOR sulla coda che riceve il messaggio generato dalla notifica. Per accedere alle notifiche, è possibile eseguire il polling della coda. |
Per creare una traccia, è necessario disporre almeno dell'autorizzazione ALTER TRACE. È 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. È inoltre necessaria l'autorizzazione RECEIVE sulla 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 Motore di database e Service BrokerTransact-SQL. |
È possibile accedere ai dati degli eventi di traccia a livello di codice eseguendo una query sulla tabella di traccia corrispondente, analizzando il file di traccia o usando la classe TraceReader (SMO) 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à della notifica degli eventi.
Attività | Argomento |
---|---|
Viene descritto come creare e implementare notifiche degli eventi. | Implementazione di notifiche degli eventi |
Viene descritto come configurare la sicurezza della finestra di dialogo di Service Broker per le notifiche degli eventi che inviano messaggi a un service broker in 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 |