MSDE FunClub
Microsoft Data Engine FunClub
MSDE初心者向けメーリングリスト過去ログ[1087]番
 
[TOP]>[MSDE初心者向けメーリングリスト過去ログ(1087番)]>[ウィンドを閉じる]
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
ウィンドを閉じる
MSDE/SQLServer FAQ
MSDE / MSDE2000 
技術情報サポート
初心者向け
メーリングリスト
過去ログの表示
技術者向け
メーリングリスト
過去ログの表示
メーリングリスト
活動状況の
表示
MSDE TOP メニュー
MSDEトップメニューに移動します
 

 
プロファイラを使った Accessプロジェクトの「盗聴」について

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 技術サポート情報一覧]

MSDE TOP ページに移動する

 
 
 
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。