WMI Provider for Server Events の操作
このトピックでは、WMI Provider for Server Events を使用したプログラミングを行う前に、検討する必要があるガイドラインを示します。
Service Broker の有効化
WMI Provider for Server Events は、イベントに対する WQL クエリを変換して、対象とするデータベースにイベント通知を作成します。イベント通知のしくみを理解しておくと、プロバイダに対してプログラミングを行う際に役立つ場合があります。詳細については、「イベント通知 (データベース エンジン)」を参照してください。
特に、WMI プロバイダによって作成されたイベント通知は、SQL Server を使用してサーバー イベントに関するメッセージを送信するため、イベントが生成される場合は必ずこのサービスが有効化されている必要があります。サーバー インスタンス上のイベントに対してクエリを実行するプログラムであれば、そのインスタンスの msdb 内の Service Broker が有効化されている必要があります。これが、プロバイダによって作成される対象 Service Broker サービス (SQL/Notifications/ProcessWMIEventProviderNotification/v1.0) の拠点になります。プログラムがデータベース内のイベントまたは特定のデータベース オブジェクト上のイベントに対してクエリを実行する場合、その対象データベース内の Service Broker が有効化されている必要があります。アプリケーションの展開後に対応する Service Broker が有効化されていない場合、基になるイベント通知によって生成されたイベントはすべて、イベント通知が使用するサービスのキューに送信されますが、Service Broker が有効化されるまで WMI 管理アプリケーションには返されません。
次のクエリは、サービス インスタンス上で有効化されている Service Broker を調べ、そのブローカ インスタンスの GUID を取得します。
SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;
msdb の Service Broker GUID はプロバイダの対象サービスの拠点であり、特別な意味を持っています。
データベース内で Service Broker を有効化するには、ALTER DATABASE ステートメントの ENABLE_BROKER SET オプションを使用します。
接続文字列の指定
アプリケーションは、プロバイダによって定義された WMI 名前空間に接続することによって、WMI Provider for Server Events を SQL Server のインスタンスにダイレクトします。Windows WMI サービスは、この名前空間をプロバイダ DLL である Sqlwep.dll にマップし、これをメモリに読み込みます。SQL Server の各インスタンスは独自の WMI 名前空間を持っています。既定値は、\\.\root\Microsoft\SqlServer\ServerEvents\instance_name です。SQL Server の既定インストールでは、instance_name の既定値が MSSQLSERVER になります。
権限とサーバー認証
WMI Provider for Server Events にアクセスするには、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 = "AdventureWorks"
AND SchemaName = "Person"
AND ObjectName = "Contact"
AND ObjectType = "TABLE"
WMI プロバイダはこのクエリを変換し、AdventureWorks データベース内にイベント通知を作成します。つまり、呼び出し側は、このようなイベント通知を作成するのに必要な権限 (具体的には CREATE DATABASE DDL EVENT NOTIFICATION 権限) を AdventureWorks データベース内に持っている必要があります。
サーバー レベルをスコープとしたイベント通知を指定する WQL クエリ (SELECT * FROM ALTER_TABLE など) の場合、呼び出し側アプリケーションはサーバー レベルの CREATE DDL EVENT NOTIFICATION 権限を持っている必要があります。サーバースコープのイベント通知は、master データベースに格納されることに注意してください。これらのイベント通知のメタデータは、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
ADD_ROLE_MEMBER
DROP_ROLE_MEMBER
ADD_SERVER_ROLE_MEMBER
DROP_SERVER_ROLE_MEMBER
DENY または REVOKE (ALTER DATABASE、ALTER ANY DATABASE EVENT NOTIFICATION、CREATE DATABASE DDL EVENT NOTIFICATION、CONTROL SERVER、ALTER ANY EVENT NOTIFICATION、CREATE DDL EVENT NOTIFICATION、または CREATE TRACE EVENT NOTIFICATION 権限のみに適用されます)
クライアント側のイベント データの使用
WMI Provider for Server Events が対象データベースに必要なイベント通知を作成した後、イベント通知は msdb 内の SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 という名前の対象サービスにイベント データを送信します。対象サービスは、このイベントを msdb 内の WMIEventProviderNotificationQueue という名前のキューに格納します (サービスもキューも、プロバイダが SQL Server に最初に接続する際に動的に作成されます)。プロバイダは、このキューから XML イベント データを読み取り、それをマネージ オブジェクト形式 (MOF) に変換してからクライアント アプリケーションに返します。MOF データは、CIM (Common Information Model) クラス定義として WQL クエリから要求されるイベントのプロパティで構成されています。各プロパティには、対応する CIM 型があります。たとえば、SPID プロパティは CIM 型 Sint32 として返されます。各プロパティの CIM 型は、「WMI Provider for Server Events のクラスとプロパティ」に記載されています。