Date: Mon, 1 Mar 2004 18:56:10 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です
SQLServerには、「プロファイラ」と呼ばれる、データベースサーバーの
動作状況を観察するツールが付属します。
このプロファイラ自身がクライアント側ツールなので、離れた場所に存在する
データベースサーバーの様子を知ることが出来ます。
このプロファイラの使い方は、調査項目が非常に多岐にわたって使いこなすのが
難しいので、なかなか使い方を覚えるのが大変なのですが、簡単に言えば、
データベースクライアント側アプリケーションがデータベースサーバーにどのような
SQL文コマンドを投げたのか監視することができます。
簡単に言えば、「SQL文の盗聴監視ツール」と言えます。
問題が発生したときに、クライアント側の問題なのか、サーバー側の問題なのか、
その問題の切り分けが難しい時に役立ちます。
プロファイラを立ち上げて、
[ファイル]−[新規作成]−[トレース]
で監視先データベースサーバーへ接続します。
次に、トレースプロパティの設定がありますが、Accessプロジェクトを調べる程度で
あれば、デフォルトのまま、実行にします。
これにより、サーバーの盗聴が行われます。
プロファイラ上に、様々なイベント発生が記録されますので、大規模サーバーですと
イベントの分析が困難になります。
実行ボタンを押す前に、「フィルタ」で、取得対象を選ぶようにしましょう。
例えばクライアントのアプリケーション名に、「Office」が入っているものとします。
Accessプロジェクトでは、クライアントのアプリケーション名は、Microsoft Office XPの
ようになります
Accessプロジェクトを立ち上げてみます。フォームとレポートがある簡単なものです。
接続先のデータベースは、NorthWindCSが作成したものです。
Audit Loginイベントを見ます。これは、SQLServerに接続されたことを示します。
その表示の、SPID番号も覚えておきます。
データベースサーバー側で、その接続を担当しているプロセス番号になります。
Accessプロジェクトを立ち上げると、合計3個のAudit Loginイベントが発生します。
例えばSPID番号で、52,53,54のようになります。
しばらく何も操作せず、放っておくと、Audit Logoutイベントが記録されます。
このイベントは、接続が閉じられたことを表します。
最後に作成された54番プロセスが閉じられました。
*****************
[テーブルの表示]
*****************
例えば、テーブル「運送会社」を開いてみます。
52番プロセスと53番プロセスに、それぞれ記録されたSQL文は次のようになります。
52番プロセス
select object_name(id), user_name(uid), type, ObjectProperty(id, N'IsMSShipped') from
sysobjects where type in (N'U', N'S') and permissions(id) & 4096 <> 0
52番プロセス
exec sp_MShelpcolumns N'dbo.運送会社', NULL, 'id', 1
53番プロセス
SET NO_BROWSETABLE ON
53番プロセス
SELECT *, sql_variant_property(value, 'basetype') AS type FROM ::fn_listextendedproperty
(NULL,N'user',N'dbo',N'table',N'運送会社',NULL,NULL)
53番プロセス
SELECT *, sql_variant_property(value, 'basetype') AS type FROM ::fn_listextendedproperty
(NULL,N'user',N'dbo',N'table',N'運送会社',N'column',NULL) ORDER BY
PATINDEX(N'MS_DisplayControl', name) DESC
53番プロセス
SET ROWCOUNT 10000
53番プロセス
SELECT * FROM "dbo"."運送会社"
(以下、略)
2つのプロセスでいろいろなやり取りが行われていますが、重要なことは、テーブルの
データを取得したのが53番のプロセスを使っていると言うことが判明しました。
***************************
[ストアドプロシージャの実行]
***************************
CREATE PROCEDURE MyProc
AS
select * from 運送会社
このストアドプロシージャを、Accessプロジェクトの「クエリ」を「開く」で実行します。
この場合も、プロセス52番と53番が協調しますが、最終的には
プロセス53番で、
SET ROWCOUNT 10000
と
EXEC "dbo"."MyProc"
が実行されています。
***************************************
[フォームのレコードソースに[運送会社]を設定
***************************************
運送会社テーブルに連結したフォームを自動生成し、それを開いてみます。
フォームのレコードソースプロパティが、「運送会社」となっている例です。
プロセス53番で、
SET ROWCOUNT 10000
と
SELECT * FROM "dbo"."運送会社"
が実行されます。
****************************************************
フォームのレコードソースに[MyProcストアドプロシージャ]を設定
****************************************************
フォームのレコードソースプロパティが、「MyProc」となっている例です。
上と同様、
プロセス53番で、
SET ROWCOUNT 10000
と
EXEC "dbo"."MyProc"
が実行されます。
****************************************************
[フォームのレコードソースにSQL文を設定してみます
****************************************************
フォームのレコードソースプロパティが、
SELECT [運送コード] AS A , [運送会社] AS B , [電話番号] AS C FROM 運送会社
となっている例です。
フォームの連結コントロールも、A,B,Cに変えます
フォームを表示させると、
プロセス53番で、
SELECT [運送コード] AS A , [運送会社] AS B , [電話番号] AS C FROM 運送会社
のSQL文が投入されました。
****************************************************
VBAプログラムの実行
****************************************************
標準モジュール上で、
SUB TEST
Dim cn, rs
Set cn = CurrentProject.Connection
Set rs = cn.Execute("SELECT [運送コード] AS A , [運送会社] AS B , [電話番号]
AS C FROM 運送会社")
END SUB
を実行させました。
やはり、プロセス番号53によって
SET NO_BROWSETABLE OFF
と
SELECT [運送コード] AS A , [運送会社] AS B , [電話番号] AS C FROM 運送会社
が実行されます。
****************************************************
レポートソースに、運送会社を設定する
****************************************************
レポートのレコードソースに「運送会社」を設定し、レポートを表示してみます。
52番、53番プロセスしか存在しない状態で、レポートを表示します。
Audit Loginイベントが検出され、再び54番プロセスが作成されました。
その54番プロセスによって、
SELECT "運送コード", "運送会社", "電話番号" FROM "dbo"."運送会社"
のSQL文が実行されました。
フォームのプロセス番号とは違うプロセスによって、レコードが取得されております。
****************************************************
レポートソースに、SQL文を設定する
****************************************************
レポートのレコードソースに
SELECT [運送コード] AS A , [運送会社] AS B , [電話番号] AS C FROM 運送会社
を設定します。
52番、53番プロセスしか存在しない状態で、レポートを表示します。
上記同様、新しいログインが作成され、そのログイン(54番プロセスになる)によって
SQL文が実行されます。
以上のことをまとめると、Accessプロジェクトで作成される3個の接続1,2,3番で、
1番は、Accessプロジェクトのシステム用
2番は、テーブルやフォーム、CurrtentProjectなどのVBAで使用
3番は、レポートのレコードソース取得専用(未使用のときに接続が自動的に閉じられる)
ということがわかります。
Access2002で、検証しました。
ぜひこれを機会に、プロファイラを使ってみて下さい
SQLServerでは、誰がレコードを取得したのかという情報に触った記録を取ることは
サーバー本体ではできませんが、サーバー側でプロファイラを実行させておくと、その記録が
取れます。
プロファイラによりパフォーマンスは落ちますが、個人情報流出事件の調査資料として
今後その活用事例が増えると思います。
------------------------------------
(株)日本技術ソフト開発
堀川 明 (Akira Horikawa)
03月01日(月曜日) 18時55分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|