Usare WQL con il provider WMI per gli eventi del server
Si applica a: SQL 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 di evento creata nel database di destinazione per le notifiche degli eventi con ambito database o con ambito oggetto o nel master
database per le notifiche degli eventi con ambito server.
Si consideri, ad esempio, la query WQL seguente:
SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'
Da questa query il provider WMI tenta di produrre l'equivalente della notifica degli eventi sul server di destinazione:
USE AdventureWorks2022;
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 una sintassi WQL aggiuntiva, ma non è specifica per questo provider e viene analizzata 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 [ , ... n ] | *
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 in base al quale è possibile creare una notifica di evento. Per un elenco degli eventi disponibili, vedere Classi e proprietà del provider WMI per eventi del server. i nomi dei tipi di evento corrispondono allo stesso event_type event_group | che è possibile specificare quando si crea manualmente una notifica degli eventi usando .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 e sp_addtype
la CREATE TYPE
stored procedure generano entrambe una notifica di evento creata in un CREATE_TYPE
evento. Tuttavia, la sp_rename
stored procedure non genera alcuna notifica degli eventi. Per altre informazioni, vedere Eventi DDL.
where_condition
Predicato WHERE
di query di clausola, costituito da event_property nomi 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 .
È possibile utilizzare solo l'operando =
insieme a DatabaseName
, SchemaName
e ObjectName
. Non è possibile usare altre espressioni con queste proprietà evento.
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 gli eventi del server usa un algoritmo di base per produrre l'ambito più ristretto possibile per l'oggetto sottostante EVENT NOTIFICATION
. 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 FROM
clausola e le condizioni nella WHERE
clausola e tenta di registrare l'oggetto sottostante EVENT NOTIFICATION
con l'ambito più ristretto possibile. Se il provider non riesce a eseguire la registrazione nell'ambito più ristretto, tenta di eseguire la registrazione in ambiti successivamente superiori fino a quando non viene completata una registrazione. 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, DatabaseName='AdventureWorks2022'
viene specificato nella WHERE
clausola , il provider tenta di registrare una notifica degli eventi nel AdventureWorks2022
database. Se il database AdventureWorks2022
esiste e il client chiamante dispone delle autorizzazioni necessarie per creare una notifica degli eventi in AdventureWorks2022
, 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 fino a quando non viene creato il AdventureWorks2022
database.
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 = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'
A seconda del risultato del processo di registrazione, questa query WQL potrebbe essere registrata a livello di database o server. Tuttavia, anche se è registrato a livello di server, il provider filtra in definitiva tutti ALTER_TABLE
gli eventi che non si applicano alla Sales.SalesOrderDetail
tabella. 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, DatabaseName='AW1' OR DatabaseName='AW2'
ad esempio , viene effettuato un tentativo di registrare una singola notifica di evento nell'ambito del server anziché due notifiche evento 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. Attualmente, gli eventi a livello di oggetto sono supportati solo nelle code e solo per il QUEUE_ACTIVATION
event_type.
Non tutti gli eventi possono essere sottoposti a query in un ambito specifico. Ad esempio, una query WQL su un evento di traccia, ad esempio Lock_Deadlock, o un gruppo di eventi di traccia, TRC_LOCKS
ad esempio , può essere registrato solo a livello di server. Analogamente, anche l'evento CREATE_ENDPOINT
e il DDL_ENDPOINT_EVENTS
gruppo di eventi 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, è comunque possibile usare la WHERE
clausola come filtro per gli eventi a livello di server in base alle proprietà che corrispondono all'evento. Ad esempio, molti eventi di traccia hanno una DatabaseName
proprietà che può essere usata nella WHERE
clausola come filtro.
Le notifiche degli eventi con ambito server vengono create nel master
database 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
Gli esempi di codice Transact-SQL in questo articolo usano il AdventureWorks2022
database di esempio o AdventureWorksDW2022
, che è possibile scaricare dalla home page degli esempi di Microsoft SQL Server e dei progetti della community.
R. Eseguire una query per gli eventi nell'ambito del 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. Eseguire una query per gli eventi nell'ambito del database
Nella query WQL seguente vengono recuperate proprietà di evento specifiche per qualsiasi evento che si verifica nel database AdventureWorks2022
ed è incluso nel gruppo di eventi DDL_DATABASE_LEVEL_EVENTS
.
SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022'
C. Eseguire una query per gli eventi nell'ambito del database, filtrando in base allo schema e all'oggetto
Nella query seguente vengono recuperate tutte le proprietà di evento per qualsiasi evento ALTER_TABLE
che si verifica nella tabella Sales.SalesOrderDetail
.
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'