Utilizzo di WQL con il provider WMI per eventi del server
Le applicazioni di gestione accedono agli eventi di SQL Server usando il provider WMI per gli eventi del server eseguendo istruzioni WQL (WMI Query Language). WQL è un subset semplificato del linguaggio SQL (Structured Query Language), con alcune estensioni specifiche di WMI. Nell'uso di WQL, un'applicazione recupera un tipo di evento su un'istanza specifica di SQL Server, un database o un oggetto di database (l'unico oggetto attualmente supportato è queue). 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 = 'AdventureWorks'
Da questa query il provider WMI tenta di produrre l'equivalente della notifica degli eventi sul server di destinazione:
USE AdventureWorks ;
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 degli eventi e delle proprietà degli eventi validi, vedere Notifiche degli eventi (motore di database).For a list of valid events and event properties, see Event Notifications (motore di database).
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 WmI Provider for Server Events Classes and Properties 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 event_property possono essere sottoposte a query più volte, separate da virgole.
*
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 degli eventi disponibili, vedere Provider WMI per classi e proprietà degli eventi del server. Si noti che i nomi dei tipi di evento corrispondono allo stesso event_type event_group | che è possibile specificare quando si crea manualmente una notifica degli eventi tramite CREATE EVENT NOTIFICATION. Esempi di tipo di evento includono 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. Ad esempio, l'istruzione CREATE TYPE e sp_addtype stored procedure genereranno entrambe una notifica degli eventi creata in un evento CREATE_TYPE. Tuttavia, la stored procedure sp_rename non genera alcuna notifica degli eventi. Per altre informazioni, vedereEventi DDL.
where_condition
Predicato di query della clausola WHERE costituito da nomi event_property e operatori logici e di confronto. Il where_condition determina l'ambito in cui viene registrata la notifica dell'evento corrispondente nel database di destinazione. Può anche fungere da filtro per specificare uno schema o un oggetto specifico da cui eseguire una query event_type. Per altre informazioni, vedere la sezione 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:
La where_condition della sintassi del provider WMI per gli eventi del server determina quanto segue:
Ambito in base al quale il provider tenta di recuperare il event_type specificato: il livello del server, il livello di database o l'oggetto (l'unico oggetto attualmente supportato è queue). 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 al minimo l'attività interna nel server e il traffico di rete tra l'istanza di SQL Server e il processo host WMI. Il provider esamina il event_type specificato nella clausola FROM e le condizioni nella clausola WHERE e tenta di registrare l'EVENTO NOTIFICATION sottostante con l'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.
Ad esempio, se DatabaseName=**'AdventureWorks'**è specificato nella clausola WHERE, il provider tenta di registrare una notifica degli eventi nel database AdventureWorks2012 . Se il database AdventureWorks2012 esiste e il client chiamante dispone delle autorizzazioni necessarie per creare una notifica degli eventi in AdventureWorks2012, la registrazione ha esito positivo. 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é non viene creato il database AdventureWorks2012 .
Il where_condition può anche fungere da 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 = 'AdventureWorks' 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 AdventureWorks.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 SchemaName='X' AND ObjectType='Y' AND ObjectName='Z'
sono tutti specificati nella WHERE
clausola , viene effettuato un tentativo di registrare la notifica degli eventi direttamente nell'oggetto Z
nello schema X
. La registrazione riesce se il client dispone di autorizzazioni. Si noti che attualmente gli eventi a livello di oggetto sono supportati solo nelle code e solo per il QUEUE_ACTIVATION event_type.
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 altre informazioni sull'ambito appropriato per la registrazione degli eventi, vedere Progettazione di notifiche degli eventi. Tentativo di registrare una query WQL il cui event_type può essere registrato solo a livello di server viene sempre eseguito 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 e possono essere sottoposte a query per i metadati usando la vista del catalogo sys.server_event_notifications .
Le notifiche degli eventi con ambito database o con ambito oggetto vengono create nel database specificato e possono essere sottoposte a query per i metadati usando la vista del catalogo sys.event_notifications . È necessario anteporre alla vista del catalogo il nome del database corrispondente.
Esempi
R. Query su eventi nell'ambito server
La query WQL seguente recupera tutte le proprietà dell'evento per qualsiasi SERVER_MEMORY_CHANGE
evento di traccia che si verifica nell'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 AdventureWorks
ed è incluso nel gruppo di eventi DDL_DATABASE_LEVEL_EVENTS
.
SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks'
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 AdventureWorks.Sales.SalesOrderDetail
.
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'
Vedi anche
Concetti relativi al provider WMI per eventi del server
Notifiche degli eventi (motore di database)