WMI Provider for Server イベントを操作する
適用対象: SQL サーバー
この記事では、WMI Provider for Server Events を使用する前に考慮する必要があるガイドラインについて説明します。
Service Broker を有効にする
WMI Provider for Server Events は、イベントに対する WQL クエリを変換して、対象とするデータベースにイベント通知を作成します。 イベント通知のしくみを理解しておくと、プロバイダーに対してプログラミングを行う際に役立つ場合があります。 詳細については、「 WMI Provider for Server Events の概念を参照してください。
特に、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
のサービス ブローカー 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 クエリのスコープの詳細については、「 WQL と WMI Provider for Server Events の使用を参照してください。
スコープの例として、次の WQL クエリを含む WMI プロバイダー アプリケーションを考えます。
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
AND SchemaName = "Person"
AND ObjectName = "Person"
AND ObjectType = "TABLE";
WMI プロバイダーはこのクエリを変換し、AdventureWorks2022
データベース内にイベント通知を作成します。 つまり、呼び出し側は、このようなイベント通知を作成するのに必要な権限 (具体的には CREATE DATABASE DDL EVENT NOTIFICATION 権限) を AdventureWorks2022
データベース内に持っている必要があります。
サーバー レベルをスコープとしたイベント通知を指定する WQL クエリ (SELECT * FROM ALTER_TABLE など) の場合、呼び出し側アプリケーションはサーバー レベルの CREATE DDL EVENT NOTIFICATION 権限を持っている必要があります。 サーバー スコープのイベント通知は、 master
データベースに格納されます。 sys.server_event_notifications カタログ ビューを使用して、そのメタデータを表示できます。
Note
WMI プロバイダーによって作成されるイベント通知のスコープ (サーバー、データベース、またはオブジェクト) は、最終的には、WMI プロバイダーによって使用される権限検証プロセスの結果によって異なります。 これは、プロバイダーを呼び出しているユーザーの権限セットとクエリ対象のデータベースの検証の影響を受けます。
前の例では、プロバイダーはまず、データベース スコープ (ON DATABASE
) のイベント通知を作成しようとします。 プロバイダーがデータベースの存在を検出し、このデータベース上でイベント通知を作成するために必要な権限を呼び出し側が持っていると確認すると、登録が正常に行われます。 成功しなかった場合、プロバイダーはサーバー (ON SERVER
) にイベント通知を作成しようとします。 この試行が成功したと仮定すると、サーバー上で発生するすべての ALTER_TABLE
イベントは、SQL Server プロセスから WMI サービス プロセスに送信されます。 ただし、プロバイダーは、 AdventureWorks2022
データベースに適用されないイベントをすべて除外します。 このプロセスは、イベントのスコープに対して必要なネットワーク トラフィック量を増加させる場合がありますが、このプロセスによって、データベースを作成する前にそのデータベースに関する 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 がターゲット データベースに必要なイベント通知を作成した後、イベント通知は、SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 という名前のmsdb
内のターゲット サービスにイベント データを送信します。 ターゲット サービスは、WMIEventProviderNotificationQueue という名前のmsdb
内のキューにイベントを配置します。 (サービスとキューの両方が、最初に SQL Server に接続するときにプロバイダーによって動的に作成されます)。プロバイダーは、このキューから XML イベント データを読み取り、クライアント アプリケーションに返す前に、それをマネージド オブジェクト形式 (MOF) に変換します。 MOF データは、CIM (Common Information Model) クラス定義として WQL クエリから要求されるイベントのプロパティで構成されています。 各プロパティには、対応する CIM 型があります。 たとえば、 SPID
プロパティは CIM 型 Sint32 として返されます。 各プロパティの CIM 型は、 WMI Provider for Server Events のクラスとプロパティの各イベント クラスの下に一覧表示されます。