Condividi tramite


Utilizzo di WQL con il provider WMI per eventi del server

Le applicazioni di gestione accedono agli eventi di SQL Server utilizzando il provider WMI per eventi del server ed eseguendo istruzioni WQL (WMI Query Language). WQL è un subset semplificato del linguaggio SQL (Structured Query Language), con alcune estensioni specifiche di WMI. Quando si utilizza WQL, un'applicazione recupera un tipo di evento da un'istanza specifica di SQL Server, un database o un oggetto di database (l'unico oggetto attualmente supportato è la coda). Il provider WMI per eventi del server converte la query in una notifica degli eventi creata nel database di destinazione per le notifiche degli eventi con ambito database o con ambito oggetto o nel database master per le notifiche degli eventi con ambito server.

Si consideri, ad esempio, la query WQL seguente:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2008R2'

Da questa query il provider WMI tenta di produrre l'equivalente della notifica degli eventi sul server di destinazione:

USE AdventureWorks2008R2 ;
GO

CREATE EVENT NOTIFICATION SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9
    ON DATABASE
    WITH FAN_IN
    FOR DDL_DATABASE_LEVEL_EVENTS
    TO SERVICE 
        'SQL/Notifications/ProcessWMIEventProviderNotification/v1.0',
        'A7E5521A-1CA6-4741-865D-826F804E5135';
GO

L'argomento nella clausola FROM della query WQL (DDL_DATABASE_LEVEL_EVENTS) può essere qualsiasi evento valido per il quale può essere creata una notifica. Gli argomenti nelle clausole SELECT e WHERE possono specificare qualsiasi proprietà di evento associata a un evento o al relativo evento padre. Per un elenco di eventi e di proprietà di evento valide, vedere Classi e proprietà del provider WMI per eventi del server.

La sintassi WQL seguente è supportata in modo esplicito dal provider WMI per eventi del server. È possibile specificare elementi di sintassi WQL aggiuntivi. Tali elementi non sono specifici di questo provider e vengono analizzati dal servizio host WMI. Per ulteriori informazioni sul linguaggio WQL (WMI Query Language), vedere la documentazione relativa a WQL in MSDN (Microsoft Developer Network).

Sintassi

SELECT { event_property [ ,...n ] | * }
FROM event_type 
WHERE where_condition 

Argomenti

  • event_property
    Proprietà di un evento. Tra gli esempi sono inclusi PostTime, SPID e LoginName. Cercare ogni evento elencato in Classi e proprietà del provider WMI per eventi del server per determinare quali proprietà contiene. L'evento DDL_DATABASE_LEVEL_EVENTS include, ad esempio, le proprietà DatabaseName e UserName. Eredita inoltre le proprietà SQLInstance, LoginName, PostTime, SPID e ComputerName dai relativi eventi padre.

  • ,...n
    Indica che è possibile sottoporre più volte a query event_property, utilizzando le virgole come separatore.

  • *
    Specifica che tutte le proprietà associate a un evento vengono sottoposte a query.

  • event_type
    Qualsiasi evento per il quale è possibile creare una notifica. Per un elenco di eventi disponibili, vedere Classi e proprietà del provider WMI per eventi del server. Notare che i nomi event type corrispondono allo stesso event_type | event_group che può essere specificato quando si crea manualmente una notifica degli eventi tramite CREATE EVENT NOTIFICATION. Tra gli esempi di event type sono inclusi CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS e TRC_DATABASE.

    Nota

    Anche determinate stored procedure di sistema che eseguono operazioni di tipo DDL possono attivare notifiche degli eventi. Testare le notifiche degli eventi per determinarne le risposte alle stored procedure di sistema eseguite. Sia l'istruzione CREATE TYPE che la stored procedure sp_addtype, ad esempio, genereranno una notifica degli eventi creata in un evento CREATE_TYPE. La stored procedure sp_rename, invece, non attiva notifiche degli eventi. Per ulteriori informazioni, vedere Eventi DDL.

  • where_condition
    Predicato della clausola WHERE della query costituito da nomi event_property e operatori logici e di confronto. where_condition determina l'ambito nel quale la notifica degli eventi corrispondente viene registrata nel database di destinazione. Può essere utilizzato anche come filtro per fare riferimento a un particolare schema o oggetto dal quale eseguire una query su event_type. Per ulteriori informazioni, vedere la sezione relativa alle osservazioni più avanti in questo argomento.

    È possibile utilizzare solo l'operando = insieme a DatabaseName, SchemaName e ObjectName. Con queste proprietà di evento non è possibile utilizzare altre espressioni.

Osservazioni

L'elemento where_condition della sintassi del provider WMI per eventi del server determina quanto segue:

  • L'ambito dal quale il provider tenta di recuperare l'oggetto event_type specificato, ovvero a livello di server, a livello di database o a livello di oggetto (l'unico oggetto attualmente supportato è la coda). Infine, tale ambito determina il tipo di notifica degli eventi creato nel database di destinazione. Questo processo viene chiamato registrazione della notifica degli eventi.

  • Il database, lo schema e l'oggetto, se appropriato, in cui effettuare la registrazione.

Il provider WMI per eventi del server utilizza un algoritmo bottom-up, first-fit per produrre l'ambito più ristretto possibile per l'oggetto EVENT NOTIFICATION sottostante. L'algoritmo tenta di ridurre l'attività interna sul server e il traffico di rete tra l'istanza di SQL Server e il processo host WMI. Il provider esamina l'oggetto event_type specificato nella clausola FROM e le condizioni nella clausola WHERE e prova a effettuare la registrazione dell'oggetto EVENT NOTIFICATION sottostante nell'ambito più ristretto possibile. Se tale registrazione non riesce, prova a eseguirla nei successivi ambiti di livello più alto finché l'operazione non riesce. Se l'esito dell'operazione è ancora negativo dopo aver raggiunto l'ambito di livello più alto, ovvero il livello del server, restituisce un errore al consumer.

Se, ad esempio, si specifica DatabaseName=**'AdventureWorks2008R2'**nella clausola WHERE, il provider prova a registrare una notifica degli eventi nel database AdventureWorks2008R2. Se il database AdventureWorks2008R2 esiste e il client chiamante dispone delle autorizzazioni necessarie per creare una notifica degli eventi in AdventureWorks2008R2, la registrazione riesce. In caso contrario, viene eseguito un tentativo di registrazione della notifica degli eventi a livello di server. La registrazione riesce se il client WMI dispone delle autorizzazioni necessarie. In questo scenario, tuttavia, gli eventi non vengono restituiti al client finché il database AdventureWorks2008R2 non sarà stato creato.

L'oggetto where_condition può anche agire come filtro per limitare ulteriormente la query a un database, uno schema o un oggetto specifico. Si consideri, ad esempio, la query WQL seguente:

SELECT * FROM ALTER_TABLE 
WHERE DatabaseName = 'AdventureWorks2008R2' AND SchemaName = 'Sales' 
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'

A seconda del risultato del processo di registrazione, questa query WQL può essere registrata a livello di database o di server. Anche se viene registrata a livello di server, tuttavia, il provider alla fine filtra gli eventi ALTER_TABLE che non sono applicabili alla tabella AdventureWorks2008R2.Sales.SalesOrderDetail. In altre parole, il provider restituisce solo le proprietà degli eventi ALTER_TABLE che si verificano in quella tabella specifica.

Se si specifica un'espressione composta, ad esempio DatabaseName='AW1' OR DatabaseName='AW2', viene effettuato il tentativo di registrare una singola notifica degli eventi nell'ambito server anziché due notifiche degli eventi separate. La registrazione riesce se il client chiamante dispone di autorizzazioni.

Se si specifica SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' nella clausola WHERE, viene effettuato il tentativo di registrare la notifica degli eventi direttamente nell'oggetto Z nello schema X. La registrazione riesce se il client dispone di autorizzazioni. Notare che attualmente gli eventi a livello di oggetto sono supportati solo nelle code e solo per l'oggetto event_type di tipo QUEUE_ACTIVATION.

Notare che non tutti gli eventi possono essere sottoposti a query in qualsiasi ambito specifico. Una query WQL su un evento di traccia quale Lock_Deadlock o un gruppo di eventi di traccia quale TRC_LOCKS può essere, ad esempio, registrata solo a livello di server. Analogamente, anche l'evento CREATE_ENDPOINT e il gruppo di eventi DDL_ENDPOINT_EVENTS possono essere registrati solo a livello di server. Per ulteriori informazioni sull'ambito appropriato per la registrazione degli eventi, vedere Progettazione di notifiche degli eventi. A livello di server viene sempre effettuato un tentativo di registrare una query WQL il cui event_type può essere registrato solo a livello di server. La registrazione riesce se il client WMI dispone di autorizzazioni. In caso contrario, al client viene restituito un errore. In alcuni casi, tuttavia, è ancora possibile utilizzare la clausola WHERE come filtro per gli eventi a livello di server in base alle proprietà che corrispondono all'evento. Molti eventi di traccia includono, ad esempio, una proprietà DatabaseName che può essere utilizzata nella clausola WHERE come filtro.

Le notifiche degli eventi con ambito server vengono create nel database master. È inoltre possibile eseguire query su di esse per recuperare i metadati utilizzando la vista del catalogo sys.server_event_notifications.

Le notifiche degli eventi con ambito oggetto o database vengono create nel database specificato. È possibile eseguire query su di esse per recuperare i metadati utilizzando la vista del catalogo sys.event_notifications. È necessario anteporre alla vista del catalogo il nome del database corrispondente.

Esempi

A. Query su eventi nell'ambito server

Nella query WQL seguente vengono recuperate tutte le proprietà di evento per qualsiasi evento di traccia SERVER_MEMORY_CHANGE che si verifica sull'istanza di SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE

B. Query su eventi nell'ambito database

Nella query WQL seguente vengono recuperate proprietà di evento specifiche per qualsiasi evento che si verifica nel database AdventureWorks2008R2 ed è incluso nel gruppo di eventi DDL_DATABASE_LEVEL_EVENTS.

SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS 
WHERE DatabaseName = 'AdventureWorks2008R2' 

C. Query su eventi nell'ambito database mediante l'applicazione di un filtro per schema e per oggetto

Nella query seguente vengono recuperate tutte le proprietà di evento per qualsiasi evento ALTER_TABLE che si verifica nella tabella AdventureWorks2008R2.Sales.SalesOrderDetail.

SELECT * FROM ALTER_TABLE 
WHERE DatabaseName = 'AdventureWorks2008R2' AND SchemaName = 'Sales' 
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'