Utilizzo del provider WMI per eventi del server

In questo argomento vengono fornite linee guida che è consigliabile tenere presenti prima di programmare tramite il provider WMI per eventi del server.

Abilitazione di 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 ulteriori informazioni, vedere Notifiche degli eventi (Motore di database).

In particolare, poiché le notifiche degli eventi create dal provider WMI utilizzano SQL Server per inviare messaggi sugli eventi del server, questo servizio deve essere abilitato ogni volta che vengono generati gli eventi. Se il programma esegue query sugli eventi in un'istanza del server, è necessario abilitare Service Broker in msdb di tale istanza, in quanto corrisponde al 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 in un determinato oggetto di database, è necessario che Service Broker sia abilitato nel database di destinazione specifico. Se il servizio di Service Broker non è abilitato in seguito alla distribuzione dell'applicazione, qualsiasi evento generato dalla notifica degli eventi sottostante viene inviato alla coda del servizio utilizzato dalla notifica, ma non viene restituito all'applicazione di gestione WMI fino a quando Service Broker non è abilitato.

La query seguente determina 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 è rilevante in quanto corrisponde al percorso del servizio di destinazione del provider.

Per abilitare Service Broker in un database, utilizzare l'opzione ENABLE_BROKER SET dell'istruzione ALTER DATABASE.

Definizione di una stringa di connessione

Le applicazioni indirizzano il provider WMI per 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 dispone di uno spazio dei nomi WMI proprio, corrispondente, per impostazione predefinita, a \\.\radice\Microsoft\SqlServer\ServerEvents\instance_name. Il valore predefinito di instance_name è MSSQLSERVER in un'istallazione predefinita di SQL Server.

Autorizzazioni e autenticazione del server

Per accedere al provider WMI per 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 nella stringa di connessione dell'applicazione.

Autorizzazioni e ambito delle notifiche degli eventi

Il provider WMI per eventi del server converte query WQL in notifiche degli eventi nel database di destinazione. Di conseguenza, l'applicazione chiamante deve disporre non solo delle autorizzazioni minime necessarie per accedere al provider, ma anche 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 ulteriori 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 = "AdventureWorks2008R2" 
    AND SchemaName = "Production"
    AND ObjectName = "Product"
    AND ObjectType = "TABLE"

Il provider WMI converte la query in una notifica degli eventi creata nel database AdventureWorks2008R2. 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 AdventureWorks2008R2.

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. Si noti che le notifiche degli eventi con ambito server vengono archiviate nel database master. 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 la registrazione ha esito negativo, il provider tenta di creare una notifica degli eventi nel server (ON SERVER). Supponendo che il tentativo abbia esito positivo, tutti gli eventi ALTER_TABLE che si verificano nel server vengono inviati dal processo di SQL Server al processo del servizio WMI. Il provider, tuttavia, esclude tramite filtro tutti gli eventi che non si applicano al database AdventureWorks2008R2. 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 si verificano entrambe le condizioni seguenti:

  • 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 o REVOKE (si applica solo alle autorizzazioni ALTER DATABASE, ALTER ANY DATABASE EVENT NOTIFICATION, CREATE DATABASE DDL EVENT NOTIFICATION, CONTROL SERVER, ALTER ANY EVENT NOTIFICATION, CREATE DDL EVENT NOTIFICATION O CREATE TRACE EVENT NOTIFICATION)

Utilizzo dei dati degli eventi sul lato client

Una volta che il provider WMI per eventi del server ha creato la notifica dell'evento richiesta nel database di destinazione, tale notifica invia i dati dell'evento al servizio di destinazione in msdb denominato SQL/Notifications/ProcessWMIEventProviderNotification/v1.0. Il servizio di destinazione inserisce l'evento in una coda in msdb denominata WMIEventProviderNotificationQueue. Sia il servizio sia la coda vengono creati dinamicamente dal provider quando si connette per la prima volta a SQL Server. Il provider legge quindi i dati degli eventi XML dalla coda e li trasforma in dati MOF (Managed Object Format) 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 all'interno di ogni classe di evento in Classi e proprietà del provider WMI per eventi del server.