このトピックでは、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 の 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です。 instance_name SQL Serverの既定のインストールでは、既定では 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 プロバイダーでの 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 権限) が必要です。
サーバー レベルをスコープとしたイベント通知を指定する 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 サービス プロセスに送信されます。 ただし、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 がターゲット データベースに必要なイベント通知を作成した後、イベント通知は 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 Classes and Properties」の各イベント クラスの下に一覧表示されます。