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_EVENTSe 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_LOCKSad 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'