Verwenden von WQL mit dem WMI-Anbieter für Serverereignisse

Gilt für:SQL Server

Verwaltungsanwendungen greifen mithilfe des WMI-Anbieters für Serverereignisse auf SQL Server-Ereignisse zu, indem WMI Query Language (WQL)-Anweisungen ausgestellt werden. WQL ist eine vereinfachte Teilmenge von Structured Query Language (SQL) mit einigen WMI-spezifischen Erweiterungen. Bei Verwendung von WQL ruft eine Anwendung einen Ereignistyp für eine bestimmte Instanz von SQL Server, einer Datenbank oder einem Datenbankobjekt ab (das derzeit einzige objekt wird in der Warteschlange unterstützt). Der WMI-Anbieter für Serverereignisse übersetzt die Abfrage in eine Ereignisbenachrichtigung, die in der Zieldatenbank für Benachrichtigungen mit Datenbankbereichs- oder Objektbereichsereignis oder in der master Datenbank für Ereignisbenachrichtigungen mit Serverbereich erstellt wird.

Betrachten Sie beispielsweise folgende WQL-Abfrage:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

Ausgehend von dieser Abfrage versucht der WMI-Anbieter, ein Äquivalent dieser Ereignisbenachrichtigung auf dem Zielserver zu produzieren:

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

Das Argument in der FROM-Klausel der WQL-Abfrage (DDL_DATABASE_LEVEL_EVENTS) kann ein beliebiges gültiges Ereignis sein, für das eine Ereignisbenachrichtigung erstellt werden kann. Für die Argumente in den Klauseln SELECT und WHERE können beliebige Ereigniseigenschaften angegeben werden, die mit einem Ereignis oder dessen übergeordnetem Ereignis verbunden sind. Eine Liste der gültigen Ereignisse und Ereigniseigenschaften finden Sie unter Ereignisbenachrichtigungen (Datenbank-Engine).For a list of valid events and event properties, see Event Notifications (Datenbank-Engine).

Die folgende WQL-Syntax wird explizit vom WMI-Anbieter für Serverereignisse unterstützt. Zusätzliche WQL-Syntax kann angegeben werden, ist jedoch nicht spezifisch für diesen Anbieter und wird stattdessen vom WMI-Hostdienst analysiert. Weitere Informationen zur WMI Query Language finden Sie in der WQL-Dokumentation im Microsoft Developer Network (MSDN).

Syntax

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

Argumente

event_property [ , ... n ] | *

Eine Eigenschaft eines Ereignisses. Beispiele hierfür sind PostTime, SPID und LoginName. Suchen Sie nach jedem Ereignis, das in WMI-Anbieter für Serverereignisse-Klassen und -Eigenschaften aufgeführt ist, um zu bestimmen, welche Eigenschaften sie enthält. Beispielsweise enthält das DDL_DATABASE_LEVEL_EVENTS-Ereignis die Eigenschaften DatabaseName und UserName. Es erbt außerdem die Eigenschaften SQLInstance, LoginName, PostTimeSPID und ComputerName von den jeweils übergeordneten Ereignissen.

  • , ... N

    Gibt an, dass event_property mehrmals abgefragt werden kann, getrennt durch Kommas.

  • *

    Gibt an, dass alle einem Ereignis zugeordneten Eigenschaften abgefragt werden.

event_type

Jedes Ereignis, für das eine Ereignisbenachrichtigung erstellt werden kann. Eine Liste der verfügbaren Ereignisse finden Sie unter WMI-Anbieter für Serverereignisse-Klassen und -Eigenschaften. Ereignistypnamen entsprechen demselben event_type | event_group, der angegeben werden kann, wenn Sie eine Ereignisbenachrichtigung manuell mithilfe von .CREATE EVENT NOTIFICATION Beispiele für Ereignistyp sind: CREATE_TABLE, , LOCK_DEADLOCK, DDL_USER_EVENTSund TRC_DATABASE.

Hinweis

Bestimmte gespeicherte Systemprozeduren, die DDL-ähnliche Vorgänge ausführen, können auch Ereignisbenachrichtigungen auslösen. Testen Sie die Ereignisbenachrichtigungen, um ihre Reaktion auf gespeicherte Systemprozeduren, die ausgeführt werden, zu bestimmen. Beispielsweise löst die Anweisung und sp_addtype die CREATE TYPE gespeicherte Prozedur eine Ereignisbenachrichtigung aus, die für ein CREATE_TYPE Ereignis erstellt wird. sp_rename Die gespeicherte Prozedur löst jedoch keine Ereignisbenachrichtigungen aus. Weitere Informationen finden Sie unter DDL-Ereignisse.

where_condition

Ein WHERE Klauselabfrage-Prädikat, bestehend aus event_property Namen und logischen und Vergleichsoperatoren. Die where_condition bestimmt den Bereich, in dem die entsprechende Ereignisbenachrichtigung in der Zieldatenbank registriert ist. Sie kann auch als Filter fungieren, um auf ein bestimmtes Schema oder Objekt abzuzielen, aus dem event_type abzufragen sind. Weitere Informationen finden Sie im Abschnitt "Hinweise ".

Nur der =-Operand kann zusammen mit DatabaseName, SchemaName und ObjectName verwendet werden. Andere Ausdrücke können nicht mit diesen Ereigniseigenschaften verwendet werden.

Hinweise

Die where_condition der Syntax des WMI-Anbieters für Serverereignisse bestimmt Folgendes:

  • Der Bereich, um den der Anbieter versucht, die angegebene event_type abzurufen: die Serverebene, die Datenbankebene oder die Objektebene (das einzige derzeit unterstützte Objekt ist Warteschlange). Letztlich bestimmt dieser Bereich den Typ der in der Zieldatenbank erstellten Ereignisbenachrichtigung. Dieser Prozess wird Ereignisbenachrichtigungsregistrierung genannt.

  • Die Datenbank, das Schema und das Objekt, auf der/dem registriert werden soll.

Der WMI-Anbieter für Serverereignisse verwendet einen Bottom-up-Algorithmus, der für den zugrunde liegenden EVENT NOTIFICATIONBereich möglichst schmal ist. Der Algorithmus versucht, interne Aktivitäten auf dem Server und den Netzwerkdatenverkehr zwischen der Instanz von SQL Server und dem WMI-Hostprozess zu minimieren. Der Anbieter untersucht die in der Klausel und den Bedingungen in der FROMWHERE Klausel angegebene event_type und versucht, den zugrunde liegenden EVENT NOTIFICATION mit dem schmalsten möglichen Bereich zu registrieren. Wenn sich der Anbieter nicht im schmalsten Bereich registrieren kann, versucht er, sich nacheinander in höheren Bereichen zu registrieren, bis eine Registrierung endlich erfolgreich ist. Wenn der höchste Bereich auf Serverebene erreicht ist und keine Registrierung zustande kam, wird dem Consumer ein Fehler zurückgegeben.

Wenn beispielsweise DatabaseName='AdventureWorks2022' in der WHERE Klausel angegeben wird, versucht der Anbieter, eine Ereignisbenachrichtigung in der AdventureWorks2022 Datenbank zu registrieren. Wenn die AdventureWorks2022-Datenbank vorhanden ist und der aufrufende Client über die erforderlichen Berechtigungen zum Erstellen einer Ereignisbenachrichtigung in AdventureWorks2022verfügt, ist die Registrierung erfolgreich. Andernfalls wird versucht, die Ereignisbenachrichtigung auf Serverebene zu registrieren. Die Registrierung ist erfolgreich, wenn der WMI-Client die erforderlichen Berechtigungen hat. In diesem Szenario werden ereignisse jedoch erst an den Client zurückgegeben, wenn die AdventureWorks2022 Datenbank erstellt wurde.

Die where_condition kann auch als Filter fungieren, um die Abfrage zusätzlich auf eine bestimmte Datenbank, ein bestimmtes Schema oder ein Objekt zu beschränken. Betrachten Sie beispielsweise folgende WQL-Abfrage:

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

Je nach Ergebnis des Registrierungsvorgangs kann diese WQL-Abfrage entweder auf Datenbank- oder Serverebene registriert werden. Selbst wenn er jedoch auf Serverebene registriert ist, filtert der Anbieter letztendlich alle ALTER_TABLE Ereignisse, die nicht für die Sales.SalesOrderDetail Tabelle gelten. Mit anderen Worten gibt der Anbieter nur die Eigenschaften der ALTER_TABLE-Ereignisse zurück, die in dieser Tabelle vorkommen.

Wenn ein zusammengesetzter Ausdruck wie DatabaseName='AW1' OR DatabaseName='AW2' angegeben wird, wird versucht, eine einzelne Ereignisbenachrichtigung im Serverbereich anstelle von zwei separaten Ereignisbenachrichtigungen zu registrieren. Die Registrierung ist erfolgreich, wenn der aufrufende Client die erforderlichen Berechtigungen hat.

Wenn SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' alle in der WHERE Klausel angegeben sind, wird versucht, die Ereignisbenachrichtigung direkt im Objekt Z im Schema Xzu registrieren. Die Registrierung ist erfolgreich, wenn der Client die erforderlichen Berechtigungen hat. Derzeit werden Ereignisse auf Objektebene nur für Warteschlangen und nur für die QUEUE_ACTIVATIONevent_type unterstützt.

Nicht alle Ereignisse können in einem bestimmten Bereich abgefragt werden. Beispielsweise kann eine WQL-Abfrage für ein Ablaufverfolgungsereignis wie Lock_Deadlock oder eine Ablaufverfolgungsereignisgruppe wie TRC_LOCKSz. B. nur auf Serverebene registriert werden. Ebenso kann das CREATE_ENDPOINT Ereignis und die DDL_ENDPOINT_EVENTS Ereignisgruppe nur auf Serverebene registriert werden. Weitere Informationen zum geeigneten Bereich für die Registrierung von Ereignissen finden Sie unter Entwerfen von Ereignisbenachrichtigungen. Ein Versuch, eine WQL-Abfrage zu registrieren, deren event_type nur auf Serverebene registriert werden kann, erfolgt immer auf Serverebene. Die Registrierung ist erfolgreich, wenn der WMI-Client die erforderlichen Berechtigungen hat. Andernfalls wird an den Client ein Fehler zurückgegeben. In einigen Fällen können Sie die WHERE Klausel jedoch weiterhin als Filter für Ereignisse auf Serverebene basierend auf den Eigenschaften verwenden, die dem Ereignis entsprechen. Beispielsweise verfügen viele Ablaufverfolgungsereignisse über eine DatabaseName Eigenschaft, die in der WHERE Klausel als Filter verwendet werden kann.

Serverweite Ereignisbenachrichtigungen werden in der master Datenbank erstellt und können mithilfe der sys.server_event_notifications Katalogansicht nach Metadaten abgefragt werden.

Ereignisbenachrichtigungen mit Datenbankbereich oder Objektbereich werden in der angegebenen Datenbank erstellt und können mithilfe der sys.event_notifications Katalogansicht nach Metadaten abgefragt werden. (Sie müssen der Katalogsicht den entsprechenden Datenbanknamen als Präfix hinzufügen.)

Beispiele

Dieser Artikel erfordert die AdventureWorks2022-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.

A. Abfragen von Ereignissen im Serverbereich

Die folgende WQL-Abfrage ruft alle Ereigniseigenschaften für jedes SERVER_MEMORY_CHANGE Ablaufverfolgungsereignis ab, das in der Instanz von SQL Server auftritt.

SELECT * FROM SERVER_MEMORY_CHANGE

B. Abfragen von Ereignissen im Datenbankbereich

Die folgende WQL-Abfrage ruft bestimmte Ereigniseigenschaften für alle Ereignisse ab, die in der AdventureWorks2022-Datenbank auftreten und in der DDL_DATABASE_LEVEL_EVENTS-Ereignisgruppe existieren.

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

C. Abfragen von Ereignissen im Datenbankbereich, Filtern nach Schema und Objekt

Die folgende Abfrage ruft alle Ereigniseigenschaften für alle ALTER_TABLE-Ereignisse ab, die in der Tabelle Sales.SalesOrderDetail auftreten.

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