SQL Server 2008 R2 BI 添付資料




     SSISを使用した
゗ベントログ収集システム
    デモ環境構築手順

    2010年01月15日 第2.0版



          マ゗クロソフト株式会社
  ...
はじめに
注意
本手順書では SQL Server 2008 R2 を使用していますが、
操作手順は SQL Server 2008 と同様です。
製品名称については随時読み替えてください。
お手元にソフトウェゕが無い場合には以下より評価版をダウンロード...
構築するシステム゗メージ

                                    データベース:LogReport


                      SSIS



                       ...
実装する制御フロー
          開始

                     参照           ComputerList
      ソース取得
                                  取り込みソ...
゗ンストール
• 事前に以下の゗ンストールを済ませておく
• Windows Server 2008 / R2 x64
   – Active Directory
• SQL Server 2008 R2 EE x64
   – ゗ンスタンス機...
第1章 準備
Windows Server にログオン

ドメ゗ン全体に対するシステム管理権限を持ったユーザー(規定は
Administrator)でログオンしてください。

本プロジェクトでは、便宜上、SQL Server の管理者 と ドメ゗ンの管理者は...
LOGREPORT データベースの作成
SQL Server Management Studioの起動
 [スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ] - [SQL Server
 Management Studi...
新しいデータベース
[データベース]を右クリックし、[新しいデータベース]を選択
[新しいデータベース]ダ゗ゕログのデータベース名に「LogReport]と入力し、[OK]
COMPUTERLISTテーブルの作成
新規テーブルの作成
[データベース]-[LogReport]-[テーブル] を右クリックして[新しいテーブル]を選択
列名とデータ型を以下の通り入力する。いずれ列もNULLは許容しないものとする。
テーブル名を設定
保存ボタンをクリックすると[名前の選択]ダ゗ゕログが表示されるので、テーブル名と
して「ComputerList」を入力する
値を追加する
ComputerListテーブルを右クリックし、「上位200行の編集」をクリックする
画面右側にテーブルの編集画面が表示されるので、以下のように入力する。こ
こでは、「SQL01」の「System゗ベントログ」と「Applicat...
SSISプロジェクトの作成
Business Intelligence Development Studio の起動

  [スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ]
  - [SQL Server ...
プロジェクトの作成
[フゔ゗ル]-[新規作成]-[プロジェクト]をクリック
Integration Services プロジェクトを選択
[Integration Services プロジェクト] を選択し、プロジェクト名をにゅうりょく
して [OK] をクリック。




                 プロジェク...
パッケージ名を設定
画面右側のソリューションエクスプローラーの[SSISパッケージ]ノード配下
で、パッケージをクリックして名前を指定する




                 ここでは、プロジェクト名
                 と...
第2章 パッケージの作成
1.制御フローの作成
制御フローを開く
[制御フロー]タブをクリックして制御フローウゖンドウを開く
開始



                ここ             ソース取得


                           ソースごとに処理を繰り返し

                               テーブル...
[SQL実行タスク]を張り付ける
[ツールボックス]の[制御フロー項目]より[SQL実行タスク]を、制御フロー
フゖールドにドラッグ&ドロップする
タスクの名称を変更する
制御フロー項目の名称を既定の「SQL実行タスク1」から「ソース取り込み」に変
更する。※変更しなくても動作に影響はない
プロパテゖシートを開く
「ソース取り込み」をダブルクリックして、プロパテゖシートを開く
ConnectionTypeの選択
 [ConnectionType]から[ADO.NET]を選択する。
 ADO.NETが無い場合には、[OLE DB]のままでもよい
接続マネージャーの作成①
[Connection]から[新しい接続]を選択して[ADO.NETの接続マネージャーの
構成]を開き、[新規作成]をクリックする



                               <新しい接続>を選択
接続マネージャーの作成②
[サーバー名]と[データベースの名の選択または入力] を入力する
ここでは、「sql01」 および 「LogReport」 を入力した。

                            SQL Serverの...
接続マネージャーの作成③
sql01.LogReport という名前の接続マネージャーが作成されたことを確認
ComputerListテーブルのレコードを取得するためのSQL文を入力
[SQLSourceType] が 「直接入力」になっていることを確認し、
[SQLStatement] 欄にSQL文を入力する



                 ...
結果セットを設定
[ResultSet] を 「完全な結果セット」に設定する。
これにより、SQLの結果が「データセット」で返される。
結果セットの格納先を設定①
 SQLの戻り値である結果セットの格納先となる変数を設定する。
 [結果セット] - [追加] をクリックし、[結果名]に「0」を入力。
 [変数名]をプルダウンして「<新しい変数>」を選択する。
結果セットの格納先を設定②
 結果セットを格納する変数を定義する。
 以下の通りに入力し、[OK]をクリック。




                          変数のスコープ


                          ...
結果セットの格納先を設定③
変数の定義を間違えた場合には、いったん削除し、②の操作を再度行う。




       クリックして削除




   左端にある「変数」をクリックして変数一覧を表示する
   画面左端に「変数」ボタンが無い場合に...
デバッグの実行①
  ここまでの設定が正しく行われていることを確認するために、デバッグを実行してみ
  る。画面上の[デバッグ開始ボタン]をクリックし、最終的に「ソース取り込み」が緑
  色になることを確認する。
  終了したら「デバッグ停止」...
デバッグの実行②
デバッグ結果が「赤」くなりエラーとなった場合には、[進行状況]タブをクリッ
クしてエラーメッセージを確認する。




  この場合はSQL文の列名に
  間違いがあることがわかる
開始


                               ソース取得


                  ここ       ソースごとに処理を繰り返し

            ※ループの作成のみ         テーブル作成...
Foreachループコンテナを配置
 ツールボックスの「制御フロー項目」から[Foreachループコンテナー」をド
 ラッグ&ドロップして配置する
「ソース取り込み」と「Foreachループコンテナ」の接続

 「ソース取り込み」下部の「緑の線」をクリックし、次に「Foreachループコン
 テナー」をクリックすると、以下のように接続される。
 これは、「ソース取り込み」処理が完了したら「...
Foreachループコンテナの名称変更
 Foreachループコンテナの名称を、「ソースごとに処理を繰り返し」に
 変更する。※変更しなくても処理自体に影響はない
Foreachループコンテナの引数を設定
 Foreachループコンテナの引数を設定するため、[コレクション]を選択する




                                ADO列挙子を選択


             ...
引数 User::ComputerList の格納先変数を定義①
 ComputerList 変数は データセットであるため、これを1行ずつ取り込むため
 の変数を定義し、ComputerList から読み込んだレコードの格納先を指定する。
 ...
引数 User::ComputerList の格納先変数を定義②
 変数 tmpComputerName を定義する



                            ゗ンデックスには
                       ...
引数 User::ComputerList の格納先変数を定義③
 変数 tmpLogFileName を定義する




                           ゗ンデックスには
                        ...
引数 User::ComputerList の格納先変数を定義④
  以下のように定義されてることを確認する。
  くれぐれも、変数名と゗ンデックス番号の対応に間違いが無いように!
デバッグ ~ブレークポ゗ントの設定
「ソースごとに処理を繰り返し」を右クリックして[ブレークポ゗ントの編集] を選択する
「ブレークポ゗ントの設定」画面が表示されるので「ループの各繰り返しの開始点で停止し
ます」をチェックする
デバッグ ~ 実行
   ①実行する
                   ②この状態でいったん
                      停止する




   ブレークポ゗ントが設
   定されていることを示
      している



...
デバッグ ~変数をウオッチ式に追加
[ローカル]ウゖンドウの「Variable 一覧」から「User::tmpComputerName」
と 「User::tmpLogFileName」を選択後、右クリックして「ウオッチ式の追加」
をクリック
...
デバッグ ~ウオッチ画面で変数の中身を確認
          ①デバッグ開始




             ②ループの頭でいったん停止する
               処理中の項目は黄色くなる




         ③変数の値がCo...
開始


                            ソース取得


                        ソースごとに処理を繰り返し

              ここ           テーブル作成

       ...
SQL実行タスクをループ内に配置
 テーブルを作成するためのSQL文を発行するので、[ツールボックス]-
 [制御フロー項目]から[SQL実行タスク] を選択し、「ソースごと処理を
 繰り返し」内にドラッグする
SQL実行タスクの名前を変更する
 SQL実行タスクの名前を「テーブル作成」に変更する
 ※この作業は処理自体に影響を与えません
接続オブジェクトを選択
SQL実行タスク「テーブル作成」をダブルクリックしてプロパテゖシートを表示する
ConnectionType で「ADO.NET」を選択
Connection には、既に作成してある接続マネージャ「sql01.LogRe...
SQLStatementをExpressionで作成①
 ループを1回まわるたびに、゗ベントログのフゔ゗ル名(tmpLogFileName)を使用した
 テーブルを作成したい。しかし固定の SQL文を設定したので、テーブル名も固定になってし
 ...
SQLStatementをExpressionで作成②




                    ②クリック




            ①SqlStatementSource を選択
※ Eventlog_<LogFileName>テーブル の形式
 作成したいテーブルは以下の形式
  Number(int)(key)
  Category(nvarchar(50))
  CategoryString(nvarchar(50...
SQLStatementをExpressionで作成③
 [式ビルダー]に「もしテーブルが無かったら作成する」SQL文を記述する




                             ここにSQL文を
               ...
"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EventLogData_"+
@[User::tmpLogfileName] +"]...
デバッグ
デバッグを実行し、ComputerListで指定したテーブルが作成されるかどう
かを確認する。テーブルの名前は「Eventlog_Security」などとなる。

                 すべてのタスクが緑で完了するこ
  ...
開始


                            ソース取得


                        ソースごとに処理を繰り返し

                           テーブル作成

       ...
「SQL実行タスク」をループ内に配置する
 既に保存されている゗ベントログの最終の「TimeWritten」値をチェックす
 るためのには、SQL文を発行して確認する必要がある。そのため、SQL文を
 発行するための「SQL実行タスク」をループ...
「テーブルの作成」と「SQL実行タスク」を接続
 「テーブル作成」の次に取込範囲のチェックを実施するので、「テーブル作
 成」の緑の矢印を「SQL実行タスク」に接続する。
「SQL実行タスク」の名前を変更
「SQL実行タスク」を「取込範囲のチェック」に名称を変更する
接続オブジェクトを選択①
SQL実行タスク「取込範囲のチェック成」をダブルクリックしてプロパテゖシートを表示する
ConnectionType で「OLE DB」を選択
Connection で、「<新しい接続>」を選択する
         ...
接続オブジェクトを選択②
「SQLStatement」の値を「式」で定義する①
 ループを1回まわるたびに、テーブル名「Eventlog_<User::tmpLogFileName>」 に格納
 されている「<User::ComputerName>」のログから、最大の ...
「SQLStatement」の値を「式」で定義する②




                   ②クリック




           ①SqlStatementSource を選択
「SQLStatement」の値を「式」で定義する③
戻り値は MaxTimeWritten に格納される




"Select Max( TimeWritten ) as MaxTimeWritten From
[LogReport].[dbo].[EventLogData_"+ @[User...
戻り値を設定①
SQL文の戻り値は「TimeWritten」値のうち最も新しい日時。つまり、単一行
の値が返される。




            ①「全般」を選択




                                ②「...
戻り値を設定② 結果セットの設定
 「結果セット」-「追加」をクリック
 「結果名」に「0」を入力し、「変数名」から「<新しい変数>」を選択
戻り値を設定③ 変数の定義
 SQL文も戻り値が格納される、MaxTimeWritten 変数を定義する




                             変数のスコープはループ内のみでよ
                   ...
デバッグの実行①
「デバッグ開始」ボタンをクリックし、デバッグを開始する
ループの頭でいったん停止するので、画面下部のローカルウゖンドウから
[Valuables]-[User;;MaxTimeWritten]を右クリックして[ウォッチ式の追加...
デバッグの実行②
ウォッチ式の一覧に「User::MaxTimeWritten」が表示されたことを確認した
ら、「再開」ボタンでデバッグを再開する。


                                初期値




     ...
デバッグの実行③
 全てが「緑」となり正常に完了することを確認する。
開始


                            ソース取得


                        ソースごとに処理を繰り返し

                           テーブル作成

       ...
「WMIデータリーダータスク」を配置
タスク名の変更と優先順位制約の接続
 タスク名を「゗ベントログを一括取得」に変更し、「取込範囲のチェック」か
 ら「゗ベントログを一括取得」に対して優先順位制約(緑の線のこと)を接続
 する
WMI接続用の接続マネージャーを作成




 「テスト」をクリックしてLocalhostと接
    続できることを確認してみる
WMI用のクエリー設定
 WMI 用のクエリー(WQL)は変数に格納して渡すように設定する
WQLを格納する変数の定義




       これが変数名
戻り値の設定①
戻り値は゗ベントログが格納されたデータセットとなる。
データセットはあとで使用するために、変数に格納する。




                             データテーブル形式

                ...
戻り値の設定② 変数の定義




                必ずObject形式
                 を選択する!
変数の「式」を設定する①
画面左側の「変数」をクリックして変数一覧を表示する。
いま作成した「WQL」をクリックすると、画面右下のプロパテゖシートに「WQL」のプ
ロパテゖが表示される
変数の「式」を設定する②
変数の「式」を設定する③




                 忘れずに
               「True」にする
"Select * from Win32_NTLogEvent where logfile='"+
@[User::tmpLogFileName] + "' and TimeWritten > '" +
(DT_WSTR, 20) @[User...
デバッグ①
 「デバッグ開始」ボタンをクリックして、デバッグを開始する。
 「ローカル」ウゖンドウから「User::WQL」を右クリックして「ウォッチ式の追
 加」を実行する。
デバッグ②
変数 User::WQL にWQL文が代入されていることを確認する




取得してくるログが多い場合、「゗ベントログの一括取得」はしばらく黄色のま
まになることがある。
開始


                              ソース取得


                          ソースごとに処理を繰り返し

                             テーブル作成

 ...
Foreachループコンテナを配置する
コンテナ名を変更し優先順位制約の接続
引数の設定
    ループの引数として、WMIの戻り値である User::EventDataを設定する




EventDataはデータセッ
  トが格納されている
引数の各カラム格納する変数を定義する
 全てObject型で定義する。最終的に、次のページと同じくなるようにする。




                間違えずに!
各変数は゗ベント
ログの各カラムに   全てObject型
対応しており、順
番も各カラムの並
び順
デバッグ
 デバッグを実行し、処理が正常に完了することを確認する。
開始


                                  ソース取得


                              ソースごとに処理を繰り返し

                              ...
スクリプトタスクの配置
「レコードを1件ずつ取り出し」ループに、「スクリプトタスク」を配置する
名称を「Insert文を作成」に変更する
スクリプト言語を「VB」に切り替える
変数を定義する①      スコープを「レコードを1件ずつ取り出す」にするということ


 「レコードを1件ずつ取り出す」ループをクリックし、「変数」ボックスを
 表示する。
 以下の「変数の新規作成」ボタンをクリックして新しい変数を定義する。
変数を定義する② InsertSQL変数を作成
この後のタスクで実行するSQL文が格納される変数。
引数を指定する
スクリプトタスクの引数として、前項「レコードを1件ずつ取り出し」で作成
した変数すべてと、いま作成した InsertSQL を指定する。
引数を指定する②
スクリプト編集画面を開く




    次ページ以降のスクリプトを入力する
-----------------ここから
Dim strCategory As String = ""                                                  変数を初期化
If Not IsDBNu...
Dim strEventType As String = ""
If Not IsDBNull(Dts.Variables("User::EventType").Value) Then
                             ...
Dim strSourceName As String = ""                                            変数を初期化
If Not IsDBNull(Dts.Variables("User::So...
Dim strType As String = ""
                                                          変数を初期化
If Not IsDBNull(Dts.Variables(...
SQL文を作成

Dim strSQL As String = "INSERT INTO [LogReport].[dbo].[EventLogData_" & strLogfile & "] ([Category]" & _
 ",[Cate...
生成したSQL文を、InsertSQL変数に格納
                                ここで作成したInsertSQLを、この後のタスクで実行する



Dts.Variables("User::InsertSQL"...
開始


                                   ソース取得


                               ソースごとに処理を繰り返し

                            ...
構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版
Upcoming SlideShare
Loading in …5
×

構築手順 Ssis イベントログ取込み 第2版

2,975 views

Published on

SQL Server 2008 BI の補足資料です。セミナーのでも環境の構築手順を詳しく書いたものです。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,975
On SlideShare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
30
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

構築手順 Ssis イベントログ取込み 第2版

  1. 1. SQL Server 2008 R2 BI 添付資料 SSISを使用した ゗ベントログ収集システム デモ環境構築手順 2010年01月15日 第2.0版 マ゗クロソフト株式会社 エバンジェリスト 安納 順一
  2. 2. はじめに
  3. 3. 注意 本手順書では SQL Server 2008 R2 を使用していますが、 操作手順は SQL Server 2008 と同様です。 製品名称については随時読み替えてください。 お手元にソフトウェゕが無い場合には以下より評価版をダウンロード可能です • Windows Server 2008 または 2008 R2 ■評価版ダウンロード [2008](最大240日) http://www.microsoft.com/japan/windowsserver2008/ trial-software.mspx ※評価機関延長方法 http://support.microsoft.com/kb/948472 [2008R2](最大180日) http://technet.microsoft.com/ja-jp/evalcenter/dd459137.aspx • SQL Server 2008 R2 CTP 11月版 ■CTP版 http://www.microsoft.com/japan/sqlserver/2008/r2/prodinfo/ downloads.mspx
  4. 4. 構築するシステム゗メージ データベース:LogReport SSIS テーブル ログを収集するコ ンピューターとロ ComputerList グファイルのリスト ネットワーク上のWindows Server または Windows Client から、SSISのWMIデータリーダー を使用して゗ベントログを収集し、SQL Server Eventlog_Security ログファイルごと にテーブルを作成 2008 / R2 に保存する。 Eventlog_Application SSISで作成したパッケージは定期的に実行するもの とし、前回実行時からの差分は゗ベントログの Eventlog_System TimeWritten を基準にして判断するものとする。
  5. 5. 実装する制御フロー 開始 参照 ComputerList ソース取得 取り込みソースのリスト ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … EventLogData_<logfilename> 終了
  6. 6. ゗ンストール • 事前に以下の゗ンストールを済ませておく • Windows Server 2008 / R2 x64 – Active Directory • SQL Server 2008 R2 EE x64 – ゗ンスタンス機能 • データベースエンジンサービス – 共有機能 • Business Intelligence Development Studio • Integration Service 本手順書の環境 • ドメ゗ン名 :techfielders.com • コンピューター名 :SQL01 • SQL Server ゗ンスタンス名 :MSSQLSERVER ※本環境ではすべての機能を1台のサーバーに゗ンストールした
  7. 7. 第1章 準備
  8. 8. Windows Server にログオン ドメ゗ン全体に対するシステム管理権限を持ったユーザー(規定は Administrator)でログオンしてください。 本プロジェクトでは、便宜上、SQL Server の管理者 と ドメ゗ンの管理者は Administrator であるとします。
  9. 9. LOGREPORT データベースの作成
  10. 10. SQL Server Management Studioの起動 [スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ] - [SQL Server Management Studio] をクリック [サーバーへの接続]ダ゗ゕログボックスが起動したら、以下のように選択して[接 続] をクリック
  11. 11. 新しいデータベース [データベース]を右クリックし、[新しいデータベース]を選択 [新しいデータベース]ダ゗ゕログのデータベース名に「LogReport]と入力し、[OK]
  12. 12. COMPUTERLISTテーブルの作成
  13. 13. 新規テーブルの作成 [データベース]-[LogReport]-[テーブル] を右クリックして[新しいテーブル]を選択 列名とデータ型を以下の通り入力する。いずれ列もNULLは許容しないものとする。
  14. 14. テーブル名を設定 保存ボタンをクリックすると[名前の選択]ダ゗ゕログが表示されるので、テーブル名と して「ComputerList」を入力する
  15. 15. 値を追加する ComputerListテーブルを右クリックし、「上位200行の編集」をクリックする 画面右側にテーブルの編集画面が表示されるので、以下のように入力する。こ こでは、「SQL01」の「System゗ベントログ」と「Application゗ベントロ グ」を指定している。
  16. 16. SSISプロジェクトの作成
  17. 17. Business Intelligence Development Studio の起動 [スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ] - [SQL Server Business Intelligence Development Studio] をクリック
  18. 18. プロジェクトの作成 [フゔ゗ル]-[新規作成]-[プロジェクト]をクリック
  19. 19. Integration Services プロジェクトを選択 [Integration Services プロジェクト] を選択し、プロジェクト名をにゅうりょく して [OK] をクリック。 プロジェクト名は「LogReport」とした
  20. 20. パッケージ名を設定 画面右側のソリューションエクスプローラーの[SSISパッケージ]ノード配下 で、パッケージをクリックして名前を指定する ここでは、プロジェクト名 と同じ名前「LogReport」 とした
  21. 21. 第2章 パッケージの作成
  22. 22. 1.制御フローの作成
  23. 23. 制御フローを開く [制御フロー]タブをクリックして制御フローウゖンドウを開く
  24. 24. 開始 ここ ソース取得 ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … 終了 「ソース取り込み」部の作成 ComputerListテーブルに接続し、゗ベントログが格納されているコンピュー ターと、取込対象の゗ベントログの名前に一覧を取得する
  25. 25. [SQL実行タスク]を張り付ける [ツールボックス]の[制御フロー項目]より[SQL実行タスク]を、制御フロー フゖールドにドラッグ&ドロップする
  26. 26. タスクの名称を変更する 制御フロー項目の名称を既定の「SQL実行タスク1」から「ソース取り込み」に変 更する。※変更しなくても動作に影響はない
  27. 27. プロパテゖシートを開く 「ソース取り込み」をダブルクリックして、プロパテゖシートを開く
  28. 28. ConnectionTypeの選択 [ConnectionType]から[ADO.NET]を選択する。 ADO.NETが無い場合には、[OLE DB]のままでもよい
  29. 29. 接続マネージャーの作成① [Connection]から[新しい接続]を選択して[ADO.NETの接続マネージャーの 構成]を開き、[新規作成]をクリックする <新しい接続>を選択
  30. 30. 接続マネージャーの作成② [サーバー名]と[データベースの名の選択または入力] を入力する ここでは、「sql01」 および 「LogReport」 を入力した。 SQL Serverのサーバー名 「sql01」 事前に作成しておいたデー タベース「LogReport」
  31. 31. 接続マネージャーの作成③ sql01.LogReport という名前の接続マネージャーが作成されたことを確認
  32. 32. ComputerListテーブルのレコードを取得するためのSQL文を入力 [SQLSourceType] が 「直接入力」になっていることを確認し、 [SQLStatement] 欄にSQL文を入力する Select ComputerName,LogfileName From dbo.ComputerList
  33. 33. 結果セットを設定 [ResultSet] を 「完全な結果セット」に設定する。 これにより、SQLの結果が「データセット」で返される。
  34. 34. 結果セットの格納先を設定① SQLの戻り値である結果セットの格納先となる変数を設定する。 [結果セット] - [追加] をクリックし、[結果名]に「0」を入力。 [変数名]をプルダウンして「<新しい変数>」を選択する。
  35. 35. 結果セットの格納先を設定② 結果セットを格納する変数を定義する。 以下の通りに入力し、[OK]をクリック。 変数のスコープ 変数名 「Object」を選択 持ち間違えてしまったら次のページを参照していったん削除し、 再度同じ操作を繰り返す
  36. 36. 結果セットの格納先を設定③ 変数の定義を間違えた場合には、いったん削除し、②の操作を再度行う。 クリックして削除 左端にある「変数」をクリックして変数一覧を表示する 画面左端に「変数」ボタンが無い場合には、 [表示]メニュー-[その他のウィンドウ]-[変数] を選択
  37. 37. デバッグの実行① ここまでの設定が正しく行われていることを確認するために、デバッグを実行してみ る。画面上の[デバッグ開始ボタン]をクリックし、最終的に「ソース取り込み」が緑 色になることを確認する。 終了したら「デバッグ停止」をクリックする。 デバッグ停止 デバッグ開始 問題なければ緑色になる 「緑」ではなく「赤」の場合には設定に問題 があるので、次のページを参照のこと
  38. 38. デバッグの実行② デバッグ結果が「赤」くなりエラーとなった場合には、[進行状況]タブをクリッ クしてエラーメッセージを確認する。 この場合はSQL文の列名に 間違いがあることがわかる
  39. 39. 開始 ソース取得 ここ ソースごとに処理を繰り返し ※ループの作成のみ テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … 終了 「ソースごとに繰り返し」部の作成 「ソース取り込み」で作成した「ComputerList」オブジェクトからデータを繰 り返して取り出す処理を作成する
  40. 40. Foreachループコンテナを配置 ツールボックスの「制御フロー項目」から[Foreachループコンテナー」をド ラッグ&ドロップして配置する
  41. 41. 「ソース取り込み」と「Foreachループコンテナ」の接続 「ソース取り込み」下部の「緑の線」をクリックし、次に「Foreachループコン テナー」をクリックすると、以下のように接続される。 これは、「ソース取り込み」処理が完了したら「Foreachループコンテナ」に処 理が移ることを意味している。
  42. 42. Foreachループコンテナの名称変更 Foreachループコンテナの名称を、「ソースごとに処理を繰り返し」に 変更する。※変更しなくても処理自体に影響はない
  43. 43. Foreachループコンテナの引数を設定 Foreachループコンテナの引数を設定するため、[コレクション]を選択する ADO列挙子を選択 「ソース取り込み」の戻り 値(データセット)が格納 されているComputerList を選択 ComputerList内のレ コードをすべて取り込む ことを指定
  44. 44. 引数 User::ComputerList の格納先変数を定義① ComputerList 変数は データセットであるため、これを1行ずつ取り込むため の変数を定義し、ComputerList から読み込んだレコードの格納先を指定する。 なお、ComputerListは1行あたり2列(ComputerName, LogFileName)が含 まれるので、2つの変数を定義する必要がある。 User::ComputerList 列0 列1 ComputerName LogFileName ComputerName LogFileName 列0 User::ComputerName 列1 User::LogFileName
  45. 45. 引数 User::ComputerList の格納先変数を定義② 変数 tmpComputerName を定義する ゗ンデックスには 「0」を入れる
  46. 46. 引数 User::ComputerList の格納先変数を定義③ 変数 tmpLogFileName を定義する ゗ンデックスには 「1」を入れる
  47. 47. 引数 User::ComputerList の格納先変数を定義④ 以下のように定義されてることを確認する。 くれぐれも、変数名と゗ンデックス番号の対応に間違いが無いように!
  48. 48. デバッグ ~ブレークポ゗ントの設定 「ソースごとに処理を繰り返し」を右クリックして[ブレークポ゗ントの編集] を選択する 「ブレークポ゗ントの設定」画面が表示されるので「ループの各繰り返しの開始点で停止し ます」をチェックする
  49. 49. デバッグ ~ 実行 ①実行する ②この状態でいったん 停止する ブレークポ゗ントが設 定されていることを示 している ④Variables の「+」を ③ローカルウゖンドウ クリックして展開する のペ゗ンをドラッグし て大きくする
  50. 50. デバッグ ~変数をウオッチ式に追加 [ローカル]ウゖンドウの「Variable 一覧」から「User::tmpComputerName」 と 「User::tmpLogFileName」を選択後、右クリックして「ウオッチ式の追加」 をクリック 選択して右クリック
  51. 51. デバッグ ~ウオッチ画面で変数の中身を確認 ①デバッグ開始 ②ループの頭でいったん停止する 処理中の項目は黄色くなる ③変数の値がComputerListテーブル内のレ コードと同じであることを確認する ComputerListテーブルのレコード の数だけ繰り返すことに注意する
  52. 52. 開始 ソース取得 ソースごとに処理を繰り返し ここ テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … 終了 「テーブル作成」部の作成 ループの頭では、゗ベントログを格納するレコードが存在するかどうかを チェックし、なければ作成する
  53. 53. SQL実行タスクをループ内に配置 テーブルを作成するためのSQL文を発行するので、[ツールボックス]- [制御フロー項目]から[SQL実行タスク] を選択し、「ソースごと処理を 繰り返し」内にドラッグする
  54. 54. SQL実行タスクの名前を変更する SQL実行タスクの名前を「テーブル作成」に変更する ※この作業は処理自体に影響を与えません
  55. 55. 接続オブジェクトを選択 SQL実行タスク「テーブル作成」をダブルクリックしてプロパテゖシートを表示する ConnectionType で「ADO.NET」を選択 Connection には、既に作成してある接続マネージャ「sql01.LogReport」を選択する sql01.LogReport は、ComputerList テー ブルへの接続にも使用したもの。要は接続 文字列なので同じものを使用しても問題は ない。
  56. 56. SQLStatementをExpressionで作成① ループを1回まわるたびに、゗ベントログのフゔ゗ル名(tmpLogFileName)を使用した テーブルを作成したい。しかし固定の SQL文を設定したので、テーブル名も固定になってし まう。そこで、[SQLStatement]に記述するSQL文に変数「User::tmpLogFileName」を使 用できるようにする。 そのためには Expression(式)機能を使用する。この機能を使用すると、各属性の値を 「式」を使って表現することができ、式の中には「変数」を使用することができる。 クリック 「式」を選択
  57. 57. SQLStatementをExpressionで作成② ②クリック ①SqlStatementSource を選択
  58. 58. ※ Eventlog_<LogFileName>テーブル の形式 作成したいテーブルは以下の形式 Number(int)(key) Category(nvarchar(50)) CategoryString(nvarchar(50)) ComputerName(nvarchar(50)) Data(nvarchar(max)) EventCode(nvarchar(50)) EventIdentifier(nvarchar(50)) InsertionStrings(nvarchar(50)) Logfile(nvarchar(50)) Message(nvarchar(max)) RecordNumber(int) SourceName(nvarchar(max)) TimeGenerated(datetime) TimeWritten(datetime) Type(nvarchar(50)) User(nvarchar(50))
  59. 59. SQLStatementをExpressionで作成③ [式ビルダー]に「もしテーブルが無かったら作成する」SQL文を記述する ここにSQL文を 入力する 次のページへ
  60. 60. "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EventLogData_"+ @[User::tmpLogfileName] +"]') AND type in (N'U') ) "+ "CREATE TABLE [dbo].[EventLogData_"+ @[User::tmpLogfileName] +"] ( [Number] [int] IDENTITY(1,1) NOT NULL, [Category] [nvarchar](50) NULL, [CategoryString] [nvarchar](50) NULL, [ComputerName] [nvarchar](50) NULL, [Data] [nvarchar](max) NULL, [EventCode] [nvarchar](50) NULL, [EventIdentifier] [nvarchar](50) NULL, [EventType] [nvarchar](50) NULL, [InsertionStrings] [nvarchar](50) NULL, [LogFile] [nvarchar](50) NULL, [Message] [ntext] NULL, [RecordNumber] [int] NULL, [SourceName] [nvarchar](max) NULL, [TimeGenerated] [datetime] NULL, [TimeWritten] [datetime] NULL, [Type] [nvarchar](50) NULL, [User] [nvarchar](50) NULL, CONSTRAINT [PK_EventLogData_"+ @[User::tmpLogfileName] +"] PRIMARY KEY CLUSTERED ( [Number] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"
  61. 61. デバッグ デバッグを実行し、ComputerListで指定したテーブルが作成されるかどう かを確認する。テーブルの名前は「Eventlog_Security」などとなる。 すべてのタスクが緑で完了するこ とを確認 SQL Server Management Studioで、 ComputerListで指定したテーブルが作成された ことを確認する。 確認後は削除してしまってもよい。
  62. 62. 開始 ソース取得 ソースごとに処理を繰り返し テーブル作成 ここ 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … 終了 「取込範囲のチェック」部の作成 定期的に実行して最新の゗ベントログを取り込む場合、前回取り込んだ゗ ベントログの範囲をチェックする必要がある。ここでは゗ベントログの TimeWritten を使用する。
  63. 63. 「SQL実行タスク」をループ内に配置する 既に保存されている゗ベントログの最終の「TimeWritten」値をチェックす るためのには、SQL文を発行して確認する必要がある。そのため、SQL文を 発行するための「SQL実行タスク」をループ内に配置する。
  64. 64. 「テーブルの作成」と「SQL実行タスク」を接続 「テーブル作成」の次に取込範囲のチェックを実施するので、「テーブル作 成」の緑の矢印を「SQL実行タスク」に接続する。
  65. 65. 「SQL実行タスク」の名前を変更 「SQL実行タスク」を「取込範囲のチェック」に名称を変更する
  66. 66. 接続オブジェクトを選択① SQL実行タスク「取込範囲のチェック成」をダブルクリックしてプロパテゖシートを表示する ConnectionType で「OLE DB」を選択 Connection で、「<新しい接続>」を選択する このタスクでは戻り値がDateTime形式となる。ADO.NET では、 戻り値が無い場合にNULLを格納しようとするが、OLE DBで接 続すると「1989/12/30 00:00:00」を戻すためエラーとなら ず都合がよい。
  67. 67. 接続オブジェクトを選択②
  68. 68. 「SQLStatement」の値を「式」で定義する① ループを1回まわるたびに、テーブル名「Eventlog_<User::tmpLogFileName>」 に格納 されている「<User::ComputerName>」のログから、最大の 「TimeWritten」値を チェックしたい。そのために、 Expression(式)機能を使用してSQL文を作成する。 ②クリック ①「式」を選択
  69. 69. 「SQLStatement」の値を「式」で定義する② ②クリック ①SqlStatementSource を選択
  70. 70. 「SQLStatement」の値を「式」で定義する③
  71. 71. 戻り値は MaxTimeWritten に格納される "Select Max( TimeWritten ) as MaxTimeWritten From [LogReport].[dbo].[EventLogData_"+ @[User::tmpLogFileName] + "] Where [ComputerName] Like '" + @[User::tmpComputerName] + "%'" [ComputerName] 列を前方一致で検索している @[User::tmpLogFileName] はログフゔ゗ル名 @[User::tmpComputerName] はコンピューター名 変数名は大文字小文字を区別することに注意!
  72. 72. 戻り値を設定① SQL文の戻り値は「TimeWritten」値のうち最も新しい日時。つまり、単一行 の値が返される。 ①「全般」を選択 ②「単一行」を選択
  73. 73. 戻り値を設定② 結果セットの設定 「結果セット」-「追加」をクリック 「結果名」に「0」を入力し、「変数名」から「<新しい変数>」を選択
  74. 74. 戻り値を設定③ 変数の定義 SQL文も戻り値が格納される、MaxTimeWritten 変数を定義する 変数のスコープはループ内のみでよ いので「ソースごとに処理を繰り返 し」ループを選択してある 日付の形式を指定する 形式があっていれば適当な値でOK
  75. 75. デバッグの実行① 「デバッグ開始」ボタンをクリックし、デバッグを開始する ループの頭でいったん停止するので、画面下部のローカルウゖンドウから [Valuables]-[User;;MaxTimeWritten]を右クリックして[ウォッチ式の追加]をク リック この時点では変数には初期値が格納されている。
  76. 76. デバッグの実行② ウォッチ式の一覧に「User::MaxTimeWritten」が表示されたことを確認した ら、「再開」ボタンでデバッグを再開する。 初期値 レコードが無いと「1899/12/30 0:00:00」が返される
  77. 77. デバッグの実行③ 全てが「緑」となり正常に完了することを確認する。
  78. 78. 開始 ソース取得 ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ここ ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 Insert into … 終了 「イベントログを一括取得」部の作成 WMIを使用してリモートコンピューターの゗ベントログを一括取得する。 取得した゗ベントログはデータセットに格納される。
  79. 79. 「WMIデータリーダータスク」を配置
  80. 80. タスク名の変更と優先順位制約の接続 タスク名を「゗ベントログを一括取得」に変更し、「取込範囲のチェック」か ら「゗ベントログを一括取得」に対して優先順位制約(緑の線のこと)を接続 する
  81. 81. WMI接続用の接続マネージャーを作成 「テスト」をクリックしてLocalhostと接 続できることを確認してみる
  82. 82. WMI用のクエリー設定 WMI 用のクエリー(WQL)は変数に格納して渡すように設定する
  83. 83. WQLを格納する変数の定義 これが変数名
  84. 84. 戻り値の設定① 戻り値は゗ベントログが格納されたデータセットとなる。 データセットはあとで使用するために、変数に格納する。 データテーブル形式 「変数」を選択 <新しい変数>
  85. 85. 戻り値の設定② 変数の定義 必ずObject形式 を選択する!
  86. 86. 変数の「式」を設定する① 画面左側の「変数」をクリックして変数一覧を表示する。 いま作成した「WQL」をクリックすると、画面右下のプロパテゖシートに「WQL」のプ ロパテゖが表示される
  87. 87. 変数の「式」を設定する②
  88. 88. 変数の「式」を設定する③ 忘れずに 「True」にする
  89. 89. "Select * from Win32_NTLogEvent where logfile='"+ @[User::tmpLogFileName] + "' and TimeWritten > '" + (DT_WSTR, 20) @[User::MaxTimeWritten] + "'" • @[User::tmpLogFileName] は検索したいログフゔ゗ル名 • (DT_WSTR, 20) は 20バ゗トのUnicode文字列 • @[User::MaxTimeWritten] は最も新しいレコードの書き込み日時
  90. 90. デバッグ① 「デバッグ開始」ボタンをクリックして、デバッグを開始する。 「ローカル」ウゖンドウから「User::WQL」を右クリックして「ウォッチ式の追 加」を実行する。
  91. 91. デバッグ② 変数 User::WQL にWQL文が代入されていることを確認する 取得してくるログが多い場合、「゗ベントログの一括取得」はしばらく黄色のま まになることがある。
  92. 92. 開始 ソース取得 ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 ここ レコードを1件ずつ取り出し Insert 文を生成 ※ループの作成のみ Insert into … 終了 「レコードを1件ずつ取り出し」部の作成 前項のゕウトプットである゗ベントログが格納されたデータセットを1行 ずつ読み込むためのForEachループを作成する。取り出したレコードは各 列を変数に格納する。
  93. 93. Foreachループコンテナを配置する
  94. 94. コンテナ名を変更し優先順位制約の接続
  95. 95. 引数の設定 ループの引数として、WMIの戻り値である User::EventDataを設定する EventDataはデータセッ トが格納されている
  96. 96. 引数の各カラム格納する変数を定義する 全てObject型で定義する。最終的に、次のページと同じくなるようにする。 間違えずに!
  97. 97. 各変数は゗ベント ログの各カラムに 全てObject型 対応しており、順 番も各カラムの並 び順
  98. 98. デバッグ デバッグを実行し、処理が正常に完了することを確認する。
  99. 99. 開始 ソース取得 ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し ここ Insert 文を生成 Insert into … 終了 「INSERT文を作成」部の作成 ここではSQL Serverに格納するためのInsert文をスクリプトタスクを使用 して作成する。゗ベントログにはさまざまな文字列が含まれているため、 SQL文エラーとならないよう簡単なVB.NETを使用して微調整する。
  100. 100. スクリプトタスクの配置 「レコードを1件ずつ取り出し」ループに、「スクリプトタスク」を配置する
  101. 101. 名称を「Insert文を作成」に変更する
  102. 102. スクリプト言語を「VB」に切り替える
  103. 103. 変数を定義する① スコープを「レコードを1件ずつ取り出す」にするということ 「レコードを1件ずつ取り出す」ループをクリックし、「変数」ボックスを 表示する。 以下の「変数の新規作成」ボタンをクリックして新しい変数を定義する。
  104. 104. 変数を定義する② InsertSQL変数を作成 この後のタスクで実行するSQL文が格納される変数。
  105. 105. 引数を指定する スクリプトタスクの引数として、前項「レコードを1件ずつ取り出し」で作成 した変数すべてと、いま作成した InsertSQL を指定する。
  106. 106. 引数を指定する②
  107. 107. スクリプト編集画面を開く 次ページ以降のスクリプトを入力する
  108. 108. -----------------ここから Dim strCategory As String = "" 変数を初期化 If Not IsDBNull(Dts.Variables("User::Category").Value) Then strCategory = Dts.Variables("User::Category").Value.ToString End If Dim strCategoryString As String = "" If Not IsDBNull(Dts.Variables("User::CategoryString").Value) Then strCategoryString = Dts.Variables("User::CategoryString").Value.ToString End If Dim strComputerName As String = "" If Not IsDBNull(Dts.Variables("User::ComputerName").Value) Then strComputerName = Dts.Variables("User::ComputerName").Value End If Dim strData As String = "" If Not IsDBNull(Dts.Variables("User::Data").Value) Then strData = Dts.Variables("User::Data").Value.ToString End If Dim strEventCode As String = "" If Not IsDBNull(Dts.Variables("User::EventCode").Value) Then strEventCode = Dts.Variables("User::EventCode").Value.ToString End If Dim strEventIdentifier As String = "" If Not IsDBNull(Dts.Variables("User::EventIdentifier").Value) Then strEventIdentifier = Dts.Variables("User::EventIdentifier").Value.ToString End If
  109. 109. Dim strEventType As String = "" If Not IsDBNull(Dts.Variables("User::EventType").Value) Then 変数を初期化 strEventType = Dts.Variables("User::EventType").Value.ToString End If Dim strInsertionString As String = "" If Not IsDBNull(Dts.Variables("User::InsertionString").Value) Then strInsertionString = Dts.Variables("User::InsertionString").Value.ToString End If Dim strLogfile As String = "" If Not IsDBNull(Dts.Variables("User::Logfile").Value) Then strLogfile = Dts.Variables("User::Logfile").Value.ToString End If Dim strMessage As String = "" If Not IsDBNull(Dts.Variables("User::Message").Value) Then strMessage = Dts.Variables("User::Message").Value.ToString strMessage = Replace(strMessage, "'", "-") Message内のシンングルクオー End If テーションをハ゗フンに置き換え Dim strRecordNumber As String = "" If Not IsDBNull(Dts.Variables("User::RecordNumber").Value) Then strRecordNumber = Dts.Variables("User::RecordNumber").Value.ToString End If
  110. 110. Dim strSourceName As String = "" 変数を初期化 If Not IsDBNull(Dts.Variables("User::SourceName").Value) Then strSourceName = Dts.Variables("User::SourceName").Value.ToString End If Dim strTimeGenerated As String = "19000101 00:00:00" If Not IsDBNull(Dts.Variables("User::TimeGenerated").Value) Then strTimeGenerated = Dts.Variables("User::TimeGenerated").Value.ToString ‘YYYYMMDD HH:NN:SS 形式を生成 strTimeGenerated = Mid(strTimeGenerated, 1, 8) & " " & _ Mid(strTimeGenerated, 9, 2) & ":" & _ Mid(strTimeGenerated, 11, 2) & ":" & _ Mid(strTimeGenerated, 13, 2) End If Dim strTimeWritten As String = "19000101 00:00:00" If Not IsDBNull(Dts.Variables("User::TimeWritten").Value) Then strTimeWritten = Dts.Variables("User::TimeWritten").Value.ToString 'YYYYMMDD HH:NN:SS strTimeWritten = Mid(strTimeWritten, 1, 8) & " " & _ Mid(strTimeWritten, 9, 2) & ":" & _ Mid(strTimeWritten, 11, 2) & ":" & _ Mid(strTimeWritten, 13, 2) End If
  111. 111. Dim strType As String = "" 変数を初期化 If Not IsDBNull(Dts.Variables("User::Type").Value) Then strType = Dts.Variables("User::Type").Value.ToString End If Dim strUser As String = "" If Not IsDBNull(Dts.Variables("User::User").Value) Then strUser = Dts.Variables("User::User").Value.ToString End If
  112. 112. SQL文を作成 Dim strSQL As String = "INSERT INTO [LogReport].[dbo].[EventLogData_" & strLogfile & "] ([Category]" & _ ",[CategoryString]" & _ ",[ComputerName]" & _ ",[Data]" & _ ",[EventCode]" & _ ",[EventIdentifier]" & _ ",[EventType]" & _ ",[InsertionStrings]" & _ ",[LogFile]" & _ ",[Message]" & _ " VALUES('" & strCategory & "'," & _ ",[RecordNumber]" & _ "'" & strCategoryString & "'," & _ ",[SourceName]" & _ "'" & strComputerName & "'," & _ ",[TimeGenerated]" & _ "'" & strData & "'," & _ ",[TimeWritten]" & _ "'" & strEventCode & "'," & _ ",[Type]" & _ "'" & strEventIdentifier & "'," & _ ",[User])" & _ "'" & strEventType & "'," & _ "'" & strInsertionString & "'," & _ "'" & strLogfile & "'," & _ "'" & strMessage & "'," & _ "" & strRecordNumber & "," & _ "'" & strSourceName & "'," & _ "'" & strTimeGenerated & "'," & _ "'" & strTimeWritten & "'," & _ "'" & strType & "'," & _ "'" & strUser & "')"
  113. 113. 生成したSQL文を、InsertSQL変数に格納 ここで作成したInsertSQLを、この後のタスクで実行する Dts.Variables("User::InsertSQL").Value = strSQL Dts.Variables("User::Category").Value = Nothing Dts.Variables("User::CategoryString").Value = Nothing Dts.Variables("User::ComputerName").Value = Nothing Dts.Variables("User::Data").Value = Nothing Dts.Variables("User::EventCode").Value = Nothing Dts.Variables("User::EventIdentifier").Value = Nothing Dts.Variables("User::EventType").Value = Nothing Dts.Variables("User::InsertionString").Value = Nothing Dts.Variables("User::Logfile").Value = Nothing Dts.Variables("User::Message").Value = Nothing Dts.Variables("User::RecordNumber").Value = Nothing Dts.Variables("User::SourceName").Value = Nothing Dts.Variables("User::TimeGenerated").Value = Nothing Dts.Variables("User::TimeWritten").Value = Nothing Dts.Variables("User::Type").Value = Nothing Dts.Variables("User::User").Value = Nothing -----------------ここまで
  114. 114. 開始 ソース取得 ソースごとに処理を繰り返し テーブル作成 取り込み範囲のチェック ゗ベントログを一括取得 レコードを1件ずつ取り出し Insert 文を生成 ここ Insert into … 終了 「INSERT INTOを実行」部の作成 作成したInsert文を実行してSQL Serverにデータを格納する

×