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 Konzepte des WMI-Anbieters für Serverereignisse.

Da die vom WMI-Anbieter erstellten Ereignisbenachrichtigungen SQL Server zum Senden von Nachrichten zu Serverereignissen verwenden, muss dieser Dienst überall dort aktiviert werden, wo die Ereignisse generiert werden. Wenn Ihr Programm Ereignisse auf einem Server instance abfragt, muss der Service Broker in msdb dieses instance aktiviert werden, da dies der Speicherort des Service Broker-Zieldiensts (mit dem Namen SQL/Notifications/ProcessWMIEventProviderNotification/v1.0) ist, der vom Anbieter erstellt wird. Wenn Ihr Programm Ereignisse in einer Datenbank oder für ein bestimmtes Datenbankobjekt abfragt, muss der Service Broker in dieser Zieldatenbank aktiviert sein. Wenn der entsprechende Service Broker nach der Bereitstellung Ihrer Anwendung nicht aktiviert ist, werden alle von der zugrunde liegenden Ereignisbenachrichtigung generierten Ereignisse an die Warteschlange des Diensts gesendet, der von der Ereignisbenachrichtigung verwendet wird, aber erst dann an Ihre WMI-Verwaltungsanwendung zurückgegeben, wenn Service Broker aktiviert ist.

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.

Um Service Broker in einer Datenbank zu aktivieren, verwenden Sie die option ENABLE_BROKER SET der ALTER DATABASE-Anweisung .

Angeben einer Verbindungszeichenfolge

Anwendungen leiten den WMI-Anbieter für Serverereignisse an eine instance 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 instance von SQL Server verfügt über einen eigenen WMI-Namespace, der standardmäßig \\.\root\Microsoft\SqlServer\ServerEvents\instance_name ist. instance_name standardmäßig MSSQLSERVER in einer Standardinstallation von SQL Server.

Berechtigungen und Serverauthentifizierung

Um auf den WMI-Anbieter für Serverereignisse zuzugreifen, muss der Client, von dem eine WMI-Verwaltungsanwendung stammt, einer von Windows authentifizierten Anmeldung oder -Gruppe im instance der SQL Server entsprechen, die in der Verbindungszeichenfolge der Anwendung 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.

Informationen zum Umfang von WQL-Abfragen 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 = "AdventureWorks2012"   
    AND SchemaName = "Person"  
    AND ObjectName = "Person"  
    AND ObjectType = "TABLE";  

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

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. Sie können die sys.server_event_notifications Katalogsicht verwenden, um deren Metadaten anzuzeigen.

Hinweis

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 dieser Versuch erfolgreich ist, werden alle ALTER_TABLE Ereignisse, die auf dem Server auftreten, 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 in msdb mit dem Namen SQL/Notifications/ProcessWMIEventProviderNotification/v1.0. Der Zieldienst fügt das Ereignis in eine Warteschlange mit msdb dem Namen WMIEventProviderNotificationQueue ein. (Sowohl der Dienst als auch die Warteschlange werden dynamisch vom Anbieter erstellt, wenn er zum ersten Mal eine Verbindung mit SQL Server herstellt.) Der Anbieter liest dann die XML-Ereignisdaten aus dieser Warteschlange und transformiert sie in mof (Managed Object Format), bevor er sie an die Clientanwendung zurückgibt. 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 jede Eigenschaft sind unter jeder Ereignisklasse in WMI-Anbieter für Serverereignisklassen und Eigenschaften aufgeführt.

Weitere Informationen

Konzepte des WMI-Anbieters für Serverereignisse