Verwenden des WMI-Anbieters für Serverereignisse

Dieses Thema enthält Richtlinien, die Sie vor dem Programmieren mit dem WMI-Anbieter für Serverereignisse lesen sollten.

Aktivieren von Service Broker

Der WMI-Anbieter für Serverereignisse übersetzt WQL-Abfragen für Ereignisse in Ereignisbenachrichtigungen in der Zieldatenbank. Kenntnisse darüber, wie Ereignisbenachrichtigungen funktionieren, können bei der Programmierung mit dem Anbieter hilfreich sein. Weitere Informationen finden Sie unter Ereignisbenachrichtigung (Datenbankmodul).

Da die vom WMI-Anbieter erstellten Ereignisbenachrichtigungen Meldungen zu Serverereignissen mit SQL Server senden, muss dieser Dienst aktiviert sein, wenn die Ereignisse generiert werden. Wenn Ihr Programm Ereignisse auf einer Serverinstanz abfragt, muss der Service Broker-Dienst in msdb dieser Instanz aktiviert sein, da dies der Speicherort des vom Anbieter erstellten Service Broker-Zieldiensts ist (SQL/Notifications/ProcessWMIEventProviderNotification/v1.0). Wenn Ihr Programm Ereignisse in einer Datenbank oder in einem bestimmten Datenbankobjekt abfragt, muss der Service Broker-Dienst in dieser Zieldatenbank aktiviert sein. Wenn der entsprechende Service Broker-Dienst nach dem Bereitstellen der Anwendung nicht aktiviert wird, werden die von der zugrundeliegenden Ereignisbenachrichtigung generierten Ereignisse an die Warteschlange des von der Ereignisbenachrichtigung verwendeten Diensts gesendet, aber erst nach der Aktivierung des Service Broker-Diensts an die WMI-Verwaltungsanwendung zurückgegeben.

Mit der folgenden Abfrage wird bestimmt, welche Service Broker auf einer Serverinstanz aktiviert werden, und die GUID der Broker-Instanz wird festgelegt:

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;

Die Service Broker-GUID von msdb ist besonders interessant, da dies der Speicherort des Zieldiensts des Anbieters ist.

Verwenden Sie zum Aktivieren des Service Broker-Diensts in einer Datenbank die ENABLE_BROKER SET-Option der ALTER DATABASE-Anweisung.

Angeben einer Verbindungszeichenfolge

Anwendungen leiten den WMI-Anbieter für Serverereignisse an eine Instanz von SQL Server weiter, indem sie eine Verbindung mit einem vom Anbieter definierten WMI-Namespace herstellen. Der WMI-Dienst ordnet der Anbieter-DLL Sqlwep.dll diesen Namespace zu und lädt sie in den Arbeitsspeicher. Jede Instanz von SQL Server verfügt über einen eigenen WMI-Namespace im folgenden Standardverzeichnis: \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. In einer Standardinstallation von SQL Server wird für instance_name standardmäßig MSSQLSERVER angegeben.

Berechtigungen und Serverauthentifizierung

Um auf den WMI-Anbieter für Serverereignisse zugreifen zu können, muss der Client, von dem eine WMI-Verwaltungsanwendung stammt, dem Windows-authentifizierten Benutzer- oder Gruppennamen in der Instanz von SQL Server entsprechen, die in der Verbindungszeichenfolge der Anwendung angegeben ist.

Berechtigungen und Bereich der Ereignisbenachrichtigungen

Der WMI-Anbieter für Serverereignisse übersetzt WQL-Abfragen in Ereignisbenachrichtigungen in der Zieldatenbank. Daher muss die aufrufende Anwendung über die erforderlichen Mindestberechtigungen für den Zugriff auf den Anbieter sowie über die richtigen Berechtigungen in der Datenbank zum Erstellen der erforderlichen Ereignisbenachrichtigungen verfügen. Die folgenden Berechtigungen sind erforderlich:

  • Zum Erstellen einer Ereignisbenachrichtigung, die sich auf die Datenbank bezieht, ist mindestens die CREATE DATABASE DDL EVENT NOTIFICATION-Berechtigung in der aktuellen Datenbank erforderlich.

  • Zum Erstellen einer Ereignisbenachrichtigung für eine DDL-Anweisung, die sich auf den Server bezieht, ist mindestens die CREATE DDL EVENT NOTIFICATION-Berechtigung auf dem Server erforderlich.

  • Zum Erstellen einer Ereignisbenachrichtigung für ein Ablaufverfolgungsereignis ist mindestens die CREATE TRACE EVENT NOTIFICATION-Berechtigung auf dem Server erforderlich.

  • Zum Erstellen einer Ereignisbenachrichtigung, die sich auf eine Warteschlange bezieht, ist mindestens die ALTER-Berechtigung für die Warteschlange erforderlich.

Weitere Informationen dazu, wie WQL-Abfragen zugewiesen werden, finden Sie unter Verwenden von WQL mit dem WMI-Anbieter für Serverereignisse.

Betrachten Sie zur Darstellung des Bereichs eine WMI-Anbieteranwendung, die die folgende WQL-Abfrage enthält:

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks" 
    AND SchemaName = "Person"
    AND ObjectName = "Contact"
    AND ObjectType = "TABLE"

Der WMI-Anbieter übersetzt diese Abfrage in eine Ereignisbenachrichtigung, die in der Datenbank AdventureWorks erstellt wird. Das bedeutet, dass der Aufrufer über die erforderlichen Berechtigungen zum Erstellen einer Ereignisbenachrichtigung dieser Art, insbesondere über die CREATE DATABASE DDL EVENT NOTIFICATION-Berechtigung, in der Datenbank AdventureWorks verfügen muss.

Wenn eine WQL-Abfrage eine auf der Serverebene zugewiesene Ereignisbenachrichtigung beispielsweise durch die Ausgabe der Abfrage SELECT * FROM ALTER_TABLE angibt, muss die aufrufende Anwendung über die Berechtigung CREATE DDL EVENT NOTIFICATION auf Serverebene verfügen. Serverbezogene Ereignisbenachrichtigungen werden in der master-Datenbank gespeichert. Mithilfe der sys.server_event_notifications-Katalogsicht können Sie die zugehörigen Metadaten anzeigen.

HinweisHinweis

Der vom WMI-Anbieter (Server, Datenbank oder Objekt) erstellte Bereich der Ereignisbenachrichtigung ist letztlich von dem vom WMI-Anbieter verwendeten Ergebnis der Überprüfung der Berechtigungen abhängig. Dies wird durch die Berechtigungen des Benutzers, der den Anbieter aufruft, sowie durch die Überprüfung der abgefragten Datenbank bestimmt.

Im vorherigen Beispiel erstellt der Anbieter zunächst eine Ereignisbenachrichtigung, die sich auf die Datenbank bezieht (ON DATABASE). Wenn der Anbieter bestätigt, dass die Datenbank vorhanden ist und dass der Aufrufer über die erforderlichen Berechtigungen zum Erstellen einer Ereignisbenachrichtigung in der Datenbank verfügt, ist die Registrierung erfolgreich. Wenn die Registrierung nicht erfolgreich ist, erstellt der Anbieter eine Ereignisbenachrichtigung auf dem Server (ON SERVER). Wenn diese Registrierung erfolgreich ist, werden alle auf dem Server auftretenden ALTER_TABLE-Ereignisse vom SQL Server-Prozess an den WMI-Dienstprozess gesendet. Der Anbieter filtert jedoch alle Ereignisse heraus, die nicht für die AdventureWorks-Datenbank bestimmt sind. Durch diesen Prozess wird der Netzwerkverkehr, der für den Bereich des Ereignisses erforderlich ist, möglicherweise erhöht. Mithilfe dieses Prozesses können Sie jedoch WQL-Abfragen bereits vor dem Erstellen von Datenbanken auf den Datenbanken registrieren und nach dem Erstellen der Datenbank Ereignisdaten empfangen und DDL-Aktivitäten starten.

Berechtigungen und Meldungsüberprüfung

Der WMI-Anbieter sendet keine Meldungen für Ereignisbenachrichtigungen, wenn die beiden folgenden Bedingungen zutreffen:

  • Der Benutzer, der die Ereignisbenachrichtigung über den WMI-Anbieter erstellt hat, ist in der Datenbank nicht mehr vorhanden oder verfügt nicht mehr über die erforderliche Berechtigung zum Erstellen einer ähnlichen Ereignisbenachrichtigung.

  • Die Ereignisbenachrichtigungen werden bei folgenden Ereignissen erstellt:

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

    • DENY oder REVOKE (Gilt nur für die Berechtigungen ALTER DATABASE, ALTER ANY DATABASE EVENT NOTIFICATION, CREATE DATABASE DDL EVENT NOTIFICATION, CONTROL SERVER, ALTER ANY EVENT NOTIFICATION, CREATE DDL EVENT NOTIFICATION oder CREATE TRACE EVENT NOTIFICATION.)

Verwenden von Ereignisdaten auf der Clientseite

Nachdem der WMI-Anbieter für Serverereignisse die erforderliche Ereignisbenachrichtigung in der Zieldatenbank erstellt hat, sendet die Ereignisbenachrichtigung Ereignisdaten an den Zieldienst SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 in msdb. Der Zieldienst stellt das Ereignis in die Warteschlange WMIEventProviderNotificationQueue in msdb. (Sowohl der Dienst als auch die Warteschlange werden vom Anbieter beim Herstellen der ersten Verbindung mit SQL Server dynamisch erstellt.) Der Anbieter liest die XML-Ereignisdaten aus dieser Warteschlange, wandelt sie in MOF-Daten (Managed Object Format) um und gibt sie dann an die Clientanwendung zurück. Die MOF-Daten bestehen aus den Eigenschaften des Ereignisses, das von der WQL-Abfrage als CIM-Classendefinition (Common Information Model) angefordert wird. Jede Eigenschaft verfügt über einen entsprechenden CIM-Typ. Die SPID-Eigenschaft wird beispielsweise als CIM-Typ Sint32 zurückgegeben. Die CIM-Typen für die einzelnen Eigenschaften sind in Klassen und Eigenschaften für WMI-Anbieter für Serverereignisse unter den einzelnen Ereignisklassen aufgeführt.