Delen via


Gebruik WQL met de WMI Provider voor servergebeurtenissen

Van toepassing op:SQL Server

Managementapplicaties krijgen toegang tot SQL Server-events via de WMI Provider for Server Events door WMI Query Language (WQL) instructies uit te geven. WQL is een vereenvoudigde subset van gestructureerde querytaal (SQL), met enkele WMI-specifieke extensies. Bij het gebruik van WQL haalt een applicatie een gebeurtenistype op tegen een specifieke instantie van SQL Server, een database of een databaseobject (het enige object dat momenteel wordt ondersteund is de wachtrij). De WMI Provider for Server Events vertaalt de query naar een gebeurtenismelding die wordt aangemaakt in de doeldatabase voor database-scoped of object-scoped event notices, of in de master database voor server-scoped event notices.

Beschouw bijvoorbeeld de volgende WQL-query:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

Uit deze query probeert de WMI-provider het equivalent van deze gebeurtenismelding op de doelserver te produceren:

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

Het argument in de FROM clausule van de WQL-query (DDL_DATABASE_LEVEL_EVENTS) kan elk geldig evenement zijn waarop een gebeurtenismelding kan worden gemaakt. De argumenten in de SELECT en-clausules WHERE kunnen elke gebeurteniseigenschap specificeren die aan een gebeurtenis of zijn oudergebeurtenis is gekoppeld. Voor een lijst van geldige gebeurtenissen en gebeurteniseigenschappen, zie Event Notifications (Database Engine).

De volgende WQL-syntaxis wordt expliciet ondersteund door de WMI Provider for Server Events. Extra WQL-syntaxis kan worden gespecificeerd, maar deze is niet specifiek voor deze provider en wordt in plaats daarvan geparsed door de WMI-hostservice. Voor meer informatie over de WMI Query Language, zie de WQL-documentatie over het Microsoft Developer Network (MSDN).

Syntaxis

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

Arguments

event_property [ , ... n ] | *

Een eigendom van een gebeurtenis. Voorbeelden zijn , PostTimeSPIDen LoginName. Zoek elk event dat in WMI Provider staat vermeld op voor Server Events, klassen en eigenschappen , om te bepalen welke eigenschappen het bevat. Bijvoorbeeld, het DDL_DATABASE_LEVEL_EVENTS-event bevat de DatabaseName en-eigenschappen UserName . Het erft ook de SQLInstance, LoginName, PostTime, SPID, en ComputerName eigenschappen van zijn oudergebeurtenissen.

  • , ... n

    Geeft aan dat event_property meerdere keren geraadpleegd kan worden, gescheiden door komma's.

  • *

    Geeft aan dat alle eigenschappen die aan een gebeurtenis horen, worden geraadpleegd.

event_type

Elk evenement waartegen een gebeurtenismelding kan worden gemaakt. Voor een lijst van beschikbare evenementen, zie WMI Provider voor Server Events klassen en eigenschappen. Gebeurtenistypenamen komen overeen met dezelfde event_type | event_group die kunnen worden opgegeven wanneer je handmatig een gebeurtenismelding aanmaakt met CREATE EVENT NOTIFICATIONbehulp van . Voorbeelden van gebeurtenistypes zijn CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS, en TRC_DATABASE.

Opmerking

Bepaalde systeemopgeslagen procedures die DDL-achtige operaties uitvoeren, kunnen ook gebeurtenismeldingen afvuren. Test je gebeurtenismeldingen om te bepalen hoe ze reageren op systeemopgeslagen procedures die worden uitgevoerd. Bijvoorbeeld, zowel de instructie als CREATE TYPE de sp_addtype opgeslagen procedure zullen een gebeurtenismelding afvuren die op een CREATE_TYPE gebeurtenis wordt aangemaakt. sp_rename De opgeslagen procedure activeert echter geen gebeurtenismeldingen. Voor meer informatie, zie DDL Events.

where_condition

Een WHERE clausulequerypredicaat, bestaande uit event_property namen en logische en vergelijkingsoperatoren. De where_condition bepaalt de scope waarin de bijbehorende gebeurtenismelding wordt geregistreerd in de doeldatabase. Het kan ook fungeren als een filter om een bepaald schema of object te targeten waaruit event_type kan worden bevraagd . Voor meer informatie, zie de sectie Opmerkingen .

Alleen de = operand kan samen DatabaseNamemet worden gebruikt, SchemaName, en ObjectName. Andere expressies kunnen niet worden gebruikt met deze gebeurteniseigenschappen.

Opmerkingen

De where_condition van de syntax van de WMI Provider for Server Events bepaalt het volgende:

  • De scope waarmee de provider probeert de gespecificeerde event_type op te halen: het serverniveau, databaseniveau of objectniveau (het enige object dat momenteel wordt ondersteund is de wachtrij). Uiteindelijk bepaalt deze scope het type gebeurtenismelding dat in de doel-database wordt aangemaakt. Dit proces wordt evenementmeldingsregistratie genoemd.

  • De database, het schema en het object, waar passend, waarop geregistreerd moet worden.

De WMI Provider for Server Events gebruikt een bottom-up, first-fit algoritme om de smalst mogelijke scope voor de onderliggende EVENT NOTIFICATIONte produceren. Het algoritme probeert interne activiteit op de server en netwerkverkeer tussen de instantie van SQL Server en het WMI-hostproces te minimaliseren. De aanbieder onderzoekt de event_type gespecificeerd in de FROM clausule en de voorwaarden in de WHERE clausule, en probeert de onderliggende EVENT NOTIFICATION te registreren met de zo beperkte reikwijdte mogelijk. Als de aanbieder zich niet kan registreren op de smalste scope, probeert hij zich op steeds hogere scopes te registreren totdat een registratie uiteindelijk slaagt. Als het de hoogste scope bereikt, het serverniveau) en faalt, geeft het een foutmelding terug aan de consument.

Als DatabaseName='AdventureWorks2022' bijvoorbeeld in de WHERE clausule is gespecificeerd, probeert de provider een gebeurtenismelding in de AdventureWorks2025 database te registreren. Als de AdventureWorks2025 database bestaat en de aanroepende client de vereiste rechten heeft om een gebeurtenismelding AdventureWorks2025in te maken, is de registratie succesvol. Anders wordt geprobeerd de gebeurtenismelding op serverniveau te registreren. De registratie slaagt als de WMI-client de vereiste rechten heeft. In dit scenario worden gebeurtenissen echter pas teruggestuurd naar de client nadat de AdventureWorks2025 database is aangemaakt.

De where_condition kan ook fungeren als een filter om de query extra te beperken tot een specifieke database, schema of object. Beschouw bijvoorbeeld de volgende WQL-query:

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

Afhankelijk van het resultaat van het registratieproces kan deze WQL-query worden geregistreerd op database- of serverniveau. Zelfs als het op serverniveau geregistreerd is, filtert de provider uiteindelijk alle ALTER_TABLE gebeurtenissen die niet op de Sales.SalesOrderDetail tabel van toepassing zijn. Met andere woorden, de aanbieder geeft alleen de eigenschappen terug van de ALTER_TABLE gebeurtenissen die in die specifieke tabel voorkomen.

Als een samengestelde expressie zoals DatabaseName='AW1' OR DatabaseName='AW2' gespecificeerd is, wordt geprobeerd een enkele gebeurtenismelding op de serverscope te registreren in plaats van twee afzonderlijke gebeurtenismeldingen. De registratie slaagt als de aanroepende client rechten heeft.

Als SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' alle in de WHERE clausule zijn gespecificeerd, wordt geprobeerd de gebeurtenismelding direct op het object Z in schema Xte registreren. De registratie slaagt als de klant toestemming heeft. Momenteel worden objectniveau-evenementen alleen ondersteund in wachtrijen, en alleen voor de QUEUE_ACTIVATIONevent_type.

Niet alle gebeurtenissen kunnen op een bepaald niveau worden bevraagd. Bijvoorbeeld, een WQL-query op een trace-event zoals Lock_Deadlock, of een trace-event groep zoals TRC_LOCKS, kan alleen op serverniveau worden geregistreerd. Evenzo kunnen het CREATE_ENDPOINT event en de DDL_ENDPOINT_EVENTS event group ook alleen op serverniveau worden geregistreerd. Voor meer informatie over de juiste omvang voor het registreren van evenementen, zie Ontwerpen van Gebeurtenismeldingen. Een poging om een WQL-query te registreren waarvan de event_type alleen op serverniveau kan worden geregistreerd, wordt altijd op serverniveau gedaan. Registratie slaagt als de WMI-client toestemming heeft. Anders wordt er een foutmelding teruggegeven aan de client. In sommige gevallen kun je de WHERE clausule echter nog steeds gebruiken als filter voor serverniveau-evenementen op basis van de eigenschappen die bij het evenement horen. Bijvoorbeeld, veel trace-events hebben een DatabaseName eigenschap die in de WHERE clausule als filter kan worden gebruikt.

Server-scoped gebeurtenismeldingen worden in de master database aangemaakt en kunnen worden opgevraagd voor metadata via de catalogusweergave van sys.server_event_notifications .

Database-scoped of object-scoped gebeurtenismeldingen worden aangemaakt in de gespecificeerde database en kunnen worden opgevraagd voor metadata via de catalogusweergave van de sys.event_notifications . (Je moet de catalogusweergave voorafgaan met de bijbehorende databasenaam.)

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Eén. Zoek naar events in de serverscope

De volgende WQL-query haalt alle gebeurteniseigenschappen op voor elk SERVER_MEMORY_CHANGE trace-event dat optreedt op de instantie van SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE

B. Zoek naar gebeurtenissen in de databasescope

De volgende WQL-query haalt specifieke gebeurteniseigenschappen op voor elk evenement dat in de AdventureWorks2025 database voorkomt en onder de DDL_DATABASE_LEVEL_EVENTS gebeurtenisgroep staat.

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

C. Zoek naar gebeurtenissen in de databasescope, filterend op schema en object

De volgende query haalt alle gebeurteniseigenschappen op voor elk ALTER_TABLE evenement dat op tabel Sales.SalesOrderDetailvoorkomt.

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