Usare il provider WMI per gli eventi del server
Si applica a: SQL Server
Questo articolo fornisce linee guida da considerare prima di programmare l'uso del provider WMI per gli eventi del server.
Abilitare Service Broker
Il provider WMI per eventi del server converte query WQL per eventi in notifiche degli eventi nel database di destinazione. Una corretta comprensione del funzionamento delle notifiche degli eventi può risultare utile quando si programma per il provider. Per altre informazioni, vedere Concetti relativi al provider WMI per gli eventi del server.
In particolare, poiché le notifiche degli eventi create dal provider WMI usano SQL Server per inviare messaggi sugli eventi del server, questo servizio deve essere abilitato ovunque vengano generati gli eventi. Se il programma esegue query sugli eventi in un'istanza del server, è necessario abilitare Service Broker in msdb
tale istanza, perché si tratta del percorso del servizio Service Broker di destinazione (denominato SQL/Notifications/ProcessWMIEventProviderNotification/v1.0) creato dal provider. Se il programma esegue query sugli eventi in un database o su un oggetto di database specifico, è necessario abilitare Service Broker in tale database di destinazione. Se il Service Broker corrispondente non è abilitato dopo la distribuzione dell'applicazione, tutti gli eventi generati dalla notifica degli eventi sottostanti vengono inviati alla coda del servizio usato dalla notifica degli eventi, ma non vengono restituiti all'applicazione di gestione WMI finché Service Broker non è abilitato.
La query seguente consente di determinare i servizi di Service Broker abilitati in un'istanza del server e il GUID dell'istanza di Service Broker:
SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;
Il GUID di Service Broker di msdb
è di particolare interesse perché si tratta della posizione del servizio di destinazione del provider.
Per abilitare Service Broker in un database, utilizzare l'opzione ENABLE_BROKER SET dell'istruzione ALTER DATABASE .
Specificare una stringa di connessione
Le applicazioni indirizzano il provider WMI per gli eventi del server a un'istanza di SQL Server connettendosi a uno spazio dei nomi WMI definito dal provider. Il servizio Windows WMI esegue il mapping di questo spazio dei nomi alla DLL del provider, Sqlwep.dll, e lo carica in memoria. Ogni istanza di SQL Server ha un proprio spazio dei nomi WMI, che per impostazione predefinita è \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. instance_name il valore predefinito è MSSQLSERVER in un'installazione predefinita di SQL Server.
Autorizzazioni e autenticazione server
Per accedere al provider WMI per gli eventi del server, il client in cui ha origine un'applicazione di gestione WMI deve corrispondere all'account di accesso o al gruppo autenticato di Windows nell'istanza di SQL Server specificata nel stringa di connessione dell'applicazione.
Autorizzazioni e ambito di notifica degli eventi
Il provider WMI per eventi del server converte query WQL in notifiche degli eventi nel database di destinazione. Per questo motivo, l'applicazione chiamante non deve avere solo le autorizzazioni minime necessarie per accedere al provider, ma deve anche disporre delle autorizzazioni corrette nel database per creare le notifiche degli eventi necessarie. Sono necessarie le autorizzazioni seguenti:
Per creare una notifica degli eventi il cui ambito è costituito dal database, è necessario disporre almeno dell'autorizzazione CREATE DATABASE DDL EVENT NOTIFICATION per il database corrente.
Per creare una notifica degli eventi per un'istruzione DDL il cui ambito è costituito dal server, è necessario disporre almeno dell'autorizzazione CREATE DDL EVENT NOTIFICATION nel server.
Per creare una notifica degli eventi per un evento di traccia, è necessario disporre almeno dell'autorizzazione CREATE TRACE EVENT NOTIFICATION nel server.
Per creare una notifica degli eventi il cui ambito è costituito da una coda, è necessario disporre almeno dell'autorizzazione ALTER per la coda.
Per informazioni sull'ambito delle query WQL, vedere Utilizzo di WQL con il provider WMI per eventi del server.
Per illustrare l'ambito, si consideri un'applicazione del provider WMI che include la query WQL seguente:
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
AND SchemaName = "Person"
AND ObjectName = "Person"
AND ObjectType = "TABLE";
Il provider WMI converte la query in una notifica degli eventi creata nel database AdventureWorks2022
. Di conseguenza, il chiamante deve disporre delle autorizzazioni necessarie per creare tale notifica degli eventi, in particolare dell'autorizzazione CREATE DATABASE DDL EVENT NOTIFICATION nel database AdventureWorks2022
.
Se una query WQL specifica una notifica degli eventi con ambito a livello di server, ad esempio eseguendo la query SELECT * FROM ALTER_TABLE, l'applicazione chiamante deve disporre dell'autorizzazione CREATE DDL EVENT NOTIFICATION a livello di server. Le notifiche degli eventi con ambito server vengono archiviate nel master
database. Per visualizzare i metadati di tali notifiche, è possibile utilizzare la vista del catalogo sys.server_event_notifications .
Nota
L'ambito della notifica degli eventi creata dal provider WMI (server, database o oggetto) dipende in definitiva dal risultato del processo di verifica delle autorizzazioni utilizzato dal provider WMI, che dipende a sua volta dal set di autorizzazioni dell'utente che chiama il provider e dalla verifica del database su cui vengono eseguite le query.
Nell'esempio precedente il provider tenta innanzitutto di creare una notifica degli eventi il cui ambito è costituito dal database (ON DATABASE
). Se il provider verifica che il database è presente e che il chiamante dispone delle autorizzazioni necessarie per crearvi una notifica degli eventi, la registrazione ha esito positivo. Se l'operazione non riesce, il provider tenta di creare una notifica degli eventi nel server (ON SERVER
). Supponendo che questo tentativo abbia esito positivo, tutti gli ALTER_TABLE
eventi che si verificano nel server vengono inviati dal processo di SQL Server al processo del servizio WMI. Tuttavia, il provider filtra tutti gli eventi che non si applicano al AdventureWorks2022
database. Benché questo processo rischi di aumentare la quantità di traffico di rete richiesta per l'ambito dell'evento, offre inoltre la flessibilità necessaria per registrare query WQL nei database prima che questi vengano creati e per ricevere quindi i dati degli eventi in seguito alla creazione del database e all'avvio dell'attività DDL nel database stesso.
Autorizzazioni e verifica dei messaggi
Il provider WMI non invia messaggi per le notifiche degli eventi se entrambe le condizioni seguenti sono vere:
L'utente che ha creato la notifica degli eventi tramite il provider WMI non è più presente nel database o non dispone più dell'autorizzazione necessaria per creare una notifica degli eventi simile.
Le notifiche degli eventi vengono create negli eventi seguenti.
DROP_LOGIN
ALTER_LOGIN
DROP_USER
ALTER_USER
ADD_ROLE_MEMBER
DROP_ROLE_MEMBER
ADD_SERVER_ROLE_MEMBER
DROP_SERVER_ROLE_MEMBER
DENY
oppureREVOKE
(si applica solo alleALTER DATABASE
autorizzazioni ,CREATE DATABASE DDL EVENT NOTIFICATION
ALTER ANY DATABASE EVENT NOTIFICATION
,CONTROL SERVER
,ALTER ANY EVENT NOTIFICATION
,CREATE DDL EVENT NOTIFICATION
, oCREATE TRACE EVENT NOTIFICATION
.
Usare i dati degli eventi sul lato client
Dopo che il provider WMI per eventi server crea la notifica degli eventi richiesta nel database di destinazione, la notifica degli eventi invia i dati dell'evento al servizio di destinazione in msdb
che è denominato SQL/Notifications/ProcessWMIEventProviderNotification/v1.0. Il servizio di destinazione inserisce l'evento in una coda denominata msdb
WMIEventProviderNotificationQueue. Sia il servizio che la coda vengono creati dinamicamente dal provider quando si connette per la prima volta a SQL Server. Il provider legge quindi i dati dell'evento XML da questa coda e lo trasforma in formato oggetto gestito (MOF) prima di restituirli all'applicazione client. I dati MOF sono costituiti dalle proprietà dell'evento richiesto dalla query WQL come definizione della classe CIM (Common Information Model). Ogni proprietà dispone di un tipo CIM corrispondente. La proprietà SPID
, ad esempio, viene restituita come tipo CIM Sint32. I tipi CIM per ogni proprietà sono elencati in ogni classe di evento nelle classi e nelle proprietà del provider WMI per gli eventi del server.