次の方法で共有


サーバーイベント用WMIプロバイダーの操作

このトピックでは、WMI Provider for Server Events を使用する前に考慮する必要があるガイドラインについて説明します。

Service Broker の有効化

WMI Provider for Server Events は、イベントの WQL クエリを対象とするデータベース内のイベント通知に変換することによって機能します。 イベント通知のしくみを理解することは、プロバイダーに対してプログラミングするときに役立ちます。 詳細については、「 サーバー イベントの WMI プロバイダーの概念」を参照してください。

特に、WMI プロバイダーによって作成されたイベント通知は SQL Server を使用してサーバー イベントに関するメッセージを送信するため、イベントが生成された場所でこのサービスを有効にする必要があります。 プログラムがサーバー インスタンスのイベントを照会する場合、そのインスタンスの msdb 内の Service Broker を有効にする必要があります。これは、プロバイダーによって作成されたターゲット Service Broker サービス (SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 という名前) の場所であるためです。 プログラムがデータベースまたは特定のデータベース オブジェクトのイベントに対してクエリを実行する場合は、そのターゲット データベースの Service Broker を有効にする必要があります。 アプリケーションのデプロイ後に対応する Service Broker が有効になっていない場合、基になるイベント通知によって生成されたイベントは、イベント通知によって使用されるサービスのキューに送信されますが、Service Broker が有効になるまで WMI 管理アプリケーションには返されません。

次のクエリは、サーバー インスタンスで有効になっているサービス ブローカーとブローカー インスタンス GUID を決定します。

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;  

msdb のサービス ブローカー GUID は、プロバイダーのターゲット サービスの場所であるため、特に重要です。

データベースで Service Broker を有効にするには、 ALTER DATABASE ステートメントの ENABLE_BROKER SET オプションを使用します。

接続文字列の指定

アプリケーションは、プロバイダーによって定義された WMI 名前空間に接続することで、WMI Provider for Server イベントを SQL Server のインスタンスに転送します。 Windows WMI サービスは、この名前空間をプロバイダー DLL にマップし、Sqlwep.dllしてメモリに読み込みます。 SQL Server の各インスタンスには独自の WMI 名前空間があり、既定値は \\.\root\Microsoft\SqlServer\ServerEvents\instance_nameです。 instance_name は、SQL Server の既定のインストールでは MSSQLSERVER に既定で設定されます。

アクセス許可とサーバー認証

WMI プロバイダー for Server イベントにアクセスするには、WMI 管理アプリケーションが開始されるクライアントが、アプリケーションの接続文字列で指定された SQL Server インスタンス内の Windows 認証ログインまたはグループに対応している必要があります。

アクセス許可とイベント通知スコープ

WMI Provider for Server Events は、WQL クエリをターゲット データベースのイベント通知に変換します。 このため、呼び出し元のアプリケーションには、プロバイダーにアクセスするために必要な最小限のアクセス許可だけでなく、必要なイベント通知を作成するためのデータベース内の適切なアクセス許可も必要です。 アクセス許可は次のとおりです。

  • データベースをスコープとするイベント通知を作成するには、少なくとも、現在のデータベースの CREATE DATABASE DDL EVENT NOTIFICATION 権限が必要です。

  • サーバーをスコープとする DDL ステートメントでイベント通知を作成するには、少なくとも、サーバーでの CREATE DDL EVENT NOTIFICATION 権限が必要です。

  • トレース イベントに対してイベント通知を作成するには、少なくともサーバーで CREATE TRACE EVENT NOTIFICATION 権限が必要です。

  • キューをスコープとするイベント通知を作成するには、少なくとも、キューに対する ALTER 権限が必要です。

WQL クエリのスコープの詳細については、「 WMI Provider for Server Events での WQL の使用」を参照してください。

スコープを示すために、次の WQL クエリを含む WMI プロバイダー アプリケーションを検討してください。

SELECT * FROM ALTER_TABLE  
WHERE DatabaseName = "AdventureWorks2012"   
    AND SchemaName = "Person"  
    AND ObjectName = "Person"  
    AND ObjectType = "TABLE";  

WMI プロバイダーは、このクエリを AdventureWorks2012 データベースに作成されたイベント通知に変換します。 つまり、呼び出し元には、このようなイベント通知 (特に AdventureWorks2012 データベースに CREATE DATABASE DDL EVENT NOTIFICATION 権限) を作成するために必要なアクセス許可が必要です。

クエリ SELECT * FROM ALTER_TABLEを発行するなどして、WQL クエリでサーバー レベルでスコープ指定されたイベント通知を指定する場合、呼び出し元アプリケーションにはサーバー レベルの CREATE DDL EVENT NOTIFICATION アクセス許可が必要です。 サーバー スコープのイベント通知はマスター データベースに格納されることに注意してください。 sys.server_event_notifications カタログ ビューを使用して、そのメタデータを表示できます。

WMI プロバイダー (サーバー、データベース、またはオブジェクト) によって作成されるイベント通知のスコープは、最終的には、WMI プロバイダーによって使用されるアクセス許可検証プロセスの結果によって異なります。 これは、プロバイダーを呼び出しているユーザーのアクセス許可セットと、クエリ対象のデータベースの検証の影響を受けます。

前の例では、プロバイダーはまず、データベース (ON DATABASE) をスコープとするイベント通知の作成を試みます。 プロバイダーがデータベースが存在し、呼び出し元にイベント通知を作成するために必要なアクセス許可があることを確認すると、登録は成功します。 成功しなかった場合、プロバイダーはサーバー (ON SERVER) にイベント通知を作成しようとします。 この試行が成功したと仮定すると、サーバー上で発生するすべての ALTER_TABLE イベントは、SQL Server プロセスから WMI サービス プロセスに送信されます。 ただし、プロバイダーは、 AdventureWorks データベースに適用されないイベントをすべて除外します。 このプロセスにより、イベントのスコープに必要なネットワーク トラフィックの量が増える可能性がありますが、このプロセスでは、作成前に WQL クエリをデータベースに登録し、データベースが作成されて DDL アクティビティが開始された後にイベント データを受信する柔軟性も得られます。

アクセス許可とメッセージの検証

次の両方の条件に該当する場合、WMI プロバイダーはイベント通知のメッセージを送信しません。

  • WMI プロバイダーを介してイベント通知を作成したユーザーは、データベースに存在しなくなったか、同様のイベント通知を作成するために必要なアクセス許可を持っていません。

  • イベント通知は、次のイベントに対して作成されます。

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ロールメンバーを追加

    • ロールメンバー解除

    • サーバー ロール メンバーを追加

    • DROP_SERVER_ROLE_MEMBER

    • 拒否または取り消し (ALTER DATABASE、ALTER ANY DATABASE イベント通知、CREATE DATABASE DDL イベント通知、CONTROL SERVER、ALTER ANY イベント通知、DDL イベント通知の作成、またはトレース イベント通知の作成のアクセス許可にのみ適用されます)。

クライアント側でのイベント データの操作

WMI Provider for Server Events がターゲット データベースに必要なイベント通知を作成した後、イベント通知は 、SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 という名前の msdb 内のターゲット サービスにイベント データを送信します。 ターゲット サービスは、WMIEventProviderNotificationQueue という名前のmsdb内のキューにイベントを配置します。 (サービスとキューの両方が、最初に SQL Server に接続するときにプロバイダーによって動的に作成されます)。プロバイダーは、このキューから XML イベント データを読み取り、クライアント アプリケーションに返す前に、それをマネージド オブジェクト形式 (MOF) に変換します。 MOF データは、共通情報モデル (CIM) クラス定義として WQL クエリによって要求されるイベントのプロパティで構成されます。 各プロパティには、対応する CIM 型があります。 たとえば、 SPID プロパティは CIM 型の Sint32として返されます。 各プロパティの CIM 型は、 WMI Provider for Server Events のクラスとプロパティの各イベント クラスの下に一覧表示されます。

こちらもご覧ください

サーバー イベントの WMI プロバイダーの概念