構築手順 ssis イベントログ取込み 第2版
TRANSCRIPT
SSISを使用した ベントログ収集システム
デモ環境構築手順
2010年01月15日 第2.0版
マクロソフト株式会社 エバンジェリスト
安納 順一
SQL Server 2008 R2 BI 添付資料
はじめに
注意
本手順書では 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
お手元にソフトウェゕが無い場合には以下より評価版をダウンロード可能です
テーブル
構築するシステムメージ
データベース:LogReport
ComputerList
Eventlog_Security
Eventlog_Application
Eventlog_System
SSIS
ログを収集するコンピューターとログファイルのリスト
ログファイルごとにテーブルを作成
ネットワーク上のWindows Server または Windows Client から、SSISのWMIデータリーダーを使用してベントログを収集し、SQL Server 2008 / R2 に保存する。 SSISで作成したパッケージは定期的に実行するものとし、前回実行時からの差分はベントログのTimeWritten を基準にして判断するものとする。
実装する制御フロー
ComputerList 取り込みソースのリスト
EventLogData_<logfilename>
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
参照
ンストール • 事前に以下のンストールを済ませておく
• 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台のサーバーにンストールした
第1章 準備
Windows Server にログオン
ドメン全体に対するシステム管理権限を持ったユーザー(規定はAdministrator)でログオンしてください。 本プロジェクトでは、便宜上、SQL Server の管理者 と ドメンの管理者は Administrator であるとします。
LOGREPORT データベースの作成
SQL Server Management Studioの起動
[スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ] - [SQL Server Management Studio] をクリック [サーバーへの接続]ダゕログボックスが起動したら、以下のように選択して[接続] をクリック
新しいデータベース [データベース]を右クリックし、[新しいデータベース]を選択 [新しいデータベース]ダゕログのデータベース名に「LogReport]と入力し、[OK]
COMPUTERLISTテーブルの作成
新規テーブルの作成 [データベース]-[LogReport]-[テーブル] を右クリックして[新しいテーブル]を選択 列名とデータ型を以下の通り入力する。いずれ列もNULLは許容しないものとする。
テーブル名を設定
保存ボタンをクリックすると[名前の選択]ダゕログが表示されるので、テーブル名として「ComputerList」を入力する
値を追加する ComputerListテーブルを右クリックし、「上位200行の編集」をクリックする 画面右側にテーブルの編集画面が表示されるので、以下のように入力する。ここでは、「SQL01」の「Systemベントログ」と「Applicationベントログ」を指定している。
SSISプロジェクトの作成
Business Intelligence Development Studio の起動
[スタート] - [すべてのプログラム] - [SQl Server 2008 R2 Novenver CTP ] - [SQL Server Business Intelligence Development Studio] をクリック
プロジェクトの作成
[フゔル]-[新規作成]-[プロジェクト]をクリック
Integration Services プロジェクトを選択
[Integration Services プロジェクト] を選択し、プロジェクト名をにゅうりょくして [OK] をクリック。
プロジェクト名は「LogReport」とした
パッケージ名を設定
ここでは、プロジェクト名と同じ名前「LogReport」
とした
画面右側のソリューションエクスプローラーの[SSISパッケージ]ノード配下で、パッケージをクリックして名前を指定する
第2章 パッケージの作成
1.制御フローの作成
制御フローを開く
[制御フロー]タブをクリックして制御フローウゖンドウを開く
「ソース取り込み」部の作成 ComputerListテーブルに接続し、ベントログが格納されているコンピューターと、取込対象のベントログの名前に一覧を取得する
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ
[SQL実行タスク]を張り付ける
[ツールボックス]の[制御フロー項目]より[SQL実行タスク]を、制御フローフゖールドにドラッグ&ドロップする
タスクの名称を変更する
制御フロー項目の名称を既定の「SQL実行タスク1」から「ソース取り込み」に変更する。※変更しなくても動作に影響はない
プロパテゖシートを開く
「ソース取り込み」をダブルクリックして、プロパテゖシートを開く
ConnectionTypeの選択
[ConnectionType]から[ADO.NET]を選択する。 ADO.NETが無い場合には、[OLE DB]のままでもよい
接続マネージャーの作成① [Connection]から[新しい接続]を選択して[ADO.NETの接続マネージャーの構成]を開き、[新規作成]をクリックする
<新しい接続>を選択
接続マネージャーの作成②
[サーバー名]と[データベースの名の選択または入力] を入力する ここでは、「sql01」 および 「LogReport」 を入力した。
SQL Serverのサーバー名 「sql01」
事前に作成しておいたデータベース「LogReport」
接続マネージャーの作成③
sql01.LogReport という名前の接続マネージャーが作成されたことを確認
ComputerListテーブルのレコードを取得するためのSQL文を入力
[SQLSourceType] が 「直接入力」になっていることを確認し、[SQLStatement] 欄にSQL文を入力する
Select ComputerName,LogfileName From dbo.ComputerList
結果セットを設定
[ResultSet] を 「完全な結果セット」に設定する。 これにより、SQLの結果が「データセット」で返される。
結果セットの格納先を設定① SQLの戻り値である結果セットの格納先となる変数を設定する。 [結果セット] - [追加] をクリックし、[結果名]に「0」を入力。 [変数名]をプルダウンして「<新しい変数>」を選択する。
結果セットの格納先を設定②
結果セットを格納する変数を定義する。 以下の通りに入力し、[OK]をクリック。
変数名
変数のスコープ
持ち間違えてしまったら次のページを参照していったん削除し、 再度同じ操作を繰り返す
「Object」を選択
結果セットの格納先を設定③
変数の定義を間違えた場合には、いったん削除し、②の操作を再度行う。
左端にある「変数」をクリックして変数一覧を表示する 画面左端に「変数」ボタンが無い場合には、 [表示]メニュー-[その他のウィンドウ]-[変数] を選択
クリックして削除
デバッグの実行① ここまでの設定が正しく行われていることを確認するために、デバッグを実行してみる。画面上の[デバッグ開始ボタン]をクリックし、最終的に「ソース取り込み」が緑色になることを確認する。 終了したら「デバッグ停止」をクリックする。
問題なければ緑色になる
「緑」ではなく「赤」の場合には設定に問題があるので、次のページを参照のこと
デバッグ開始
デバッグ停止
デバッグの実行② デバッグ結果が「赤」くなりエラーとなった場合には、[進行状況]タブをクリックしてエラーメッセージを確認する。
この場合はSQL文の列名に間違いがあることがわかる
「ソースごとに繰り返し」部の作成 「ソース取り込み」で作成した「ComputerList」オブジェクトからデータを繰り返して取り出す処理を作成する
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ ※ループの作成のみ
Foreachループコンテナを配置
ツールボックスの「制御フロー項目」から[Foreachループコンテナー」をドラッグ&ドロップして配置する
「ソース取り込み」と「Foreachループコンテナ」の接続
「ソース取り込み」下部の「緑の線」をクリックし、次に「Foreachループコンテナー」をクリックすると、以下のように接続される。 これは、「ソース取り込み」処理が完了したら「Foreachループコンテナ」に処理が移ることを意味している。
Foreachループコンテナの名称変更
Foreachループコンテナの名称を、「ソースごとに処理を繰り返し」に変更する。※変更しなくても処理自体に影響はない
Foreachループコンテナの引数を設定 Foreachループコンテナの引数を設定するため、[コレクション]を選択する
ADO列挙子を選択
「ソース取り込み」の戻り値(データセット)が格納されているComputerList を選択
ComputerList内のレコードをすべて取り込むことを指定
引数 User::ComputerList の格納先変数を定義①
ComputerList 変数は データセットであるため、これを1行ずつ取り込むための変数を定義し、ComputerList から読み込んだレコードの格納先を指定する。 なお、ComputerListは1行あたり2列(ComputerName, LogFileName)が含まれるので、2つの変数を定義する必要がある。
ComputerName
User::ComputerList
LogFileName
ComputerName LogFileName
User::ComputerName
User::LogFileName
列0 列1
列0
列1
引数 User::ComputerList の格納先変数を定義②
ンデックスには「0」を入れる
変数 tmpComputerName を定義する
引数 User::ComputerList の格納先変数を定義③
ンデックスには「1」を入れる
変数 tmpLogFileName を定義する
引数 User::ComputerList の格納先変数を定義④
以下のように定義されてることを確認する。 くれぐれも、変数名とンデックス番号の対応に間違いが無いように!
デバッグ ~ブレークポントの設定 「ソースごとに処理を繰り返し」を右クリックして[ブレークポントの編集] を選択する 「ブレークポントの設定」画面が表示されるので「ループの各繰り返しの開始点で停止します」をチェックする
デバッグ ~ 実行
①実行する ②この状態でいったん
停止する
③ローカルウゖンドウのペンをドラッグし
て大きくする
④Variables の「+」をクリックして展開する
ブレークポントが設定されていることを示
している
デバッグ ~変数をウオッチ式に追加 [ローカル]ウゖンドウの「Variable 一覧」から「User::tmpComputerName」 と 「User::tmpLogFileName」を選択後、右クリックして「ウオッチ式の追加」をクリック
選択して右クリック
デバッグ ~ウオッチ画面で変数の中身を確認
①デバッグ開始
②ループの頭でいったん停止する 処理中の項目は黄色くなる
③変数の値がComputerListテーブル内のレコードと同じであることを確認する
ComputerListテーブルのレコードの数だけ繰り返すことに注意する
「テーブル作成」部の作成 ループの頭では、ベントログを格納するレコードが存在するかどうかをチェックし、なければ作成する
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ
SQL実行タスクをループ内に配置
テーブルを作成するためのSQL文を発行するので、[ツールボックス]-[制御フロー項目]から[SQL実行タスク] を選択し、「ソースごと処理を繰り返し」内にドラッグする
SQL実行タスクの名前を変更する
SQL実行タスクの名前を「テーブル作成」に変更する ※この作業は処理自体に影響を与えません
接続オブジェクトを選択 SQL実行タスク「テーブル作成」をダブルクリックしてプロパテゖシートを表示する ConnectionType で「ADO.NET」を選択 Connection には、既に作成してある接続マネージャ「sql01.LogReport」を選択する
sql01.LogReport は、ComputerList テーブルへの接続にも使用したもの。要は接続文字列なので同じものを使用しても問題はない。
SQLStatementをExpressionで作成① ループを1回まわるたびに、ベントログのフゔル名(tmpLogFileName)を使用したテーブルを作成したい。しかし固定の SQL文を設定したので、テーブル名も固定になってしまう。そこで、[SQLStatement]に記述するSQL文に変数「User::tmpLogFileName」を使用できるようにする。 そのためには Expression(式)機能を使用する。この機能を使用すると、各属性の値を「式」を使って表現することができ、式の中には「変数」を使用することができる。
「式」を選択 クリック
SQLStatementをExpressionで作成②
②クリック
①SqlStatementSource を選択
※ 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))
作成したいテーブルは以下の形式
SQLStatementをExpressionで作成③
次のページへ
[式ビルダー]に「もしテーブルが無かったら作成する」SQL文を記述する
ここにSQL文を入力する
"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]"
デバッグ デバッグを実行し、ComputerListで指定したテーブルが作成されるかどうかを確認する。テーブルの名前は「Eventlog_Security」などとなる。
すべてのタスクが緑で完了することを確認
SQL Server Management Studioで、ComputerListで指定したテーブルが作成されたことを確認する。 確認後は削除してしまってもよい。
「取込範囲のチェック」部の作成 定期的に実行して最新のベントログを取り込む場合、前回取り込んだベントログの範囲をチェックする必要がある。ここではベントログのTimeWritten を使用する。
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ
「SQL実行タスク」をループ内に配置する 既に保存されているベントログの最終の「TimeWritten」値をチェックするためのには、SQL文を発行して確認する必要がある。そのため、SQL文を発行するための「SQL実行タスク」をループ内に配置する。
「テーブルの作成」と「SQL実行タスク」を接続
「テーブル作成」の次に取込範囲のチェックを実施するので、「テーブル作成」の緑の矢印を「SQL実行タスク」に接続する。
「SQL実行タスク」の名前を変更
「SQL実行タスク」を「取込範囲のチェック」に名称を変更する
接続オブジェクトを選択① SQL実行タスク「取込範囲のチェック成」をダブルクリックしてプロパテゖシートを表示する
ConnectionType で「OLE DB」を選択 Connection で、「<新しい接続>」を選択する
このタスクでは戻り値がDateTime形式となる。ADO.NET では、戻り値が無い場合にNULLを格納しようとするが、OLE DBで接続すると「1989/12/30 00:00:00」を戻すためエラーとならず都合がよい。
接続オブジェクトを選択②
「SQLStatement」の値を「式」で定義する① ループを1回まわるたびに、テーブル名「Eventlog_<User::tmpLogFileName>」 に格納されている「<User::ComputerName>」のログから、最大の 「TimeWritten」値をチェックしたい。そのために、 Expression(式)機能を使用してSQL文を作成する。
①「式」を選択 ②クリック
「SQLStatement」の値を「式」で定義する②
②クリック
①SqlStatementSource を選択
「SQLStatement」の値を「式」で定義する③
"Select Max( TimeWritten ) as MaxTimeWritten From [LogReport].[dbo].[EventLogData_"+ @[User::tmpLogFileName] + "] Where [ComputerName] Like '" + @[User::tmpComputerName] + "%'"
@[User::tmpLogFileName] はログフゔル名 @[User::tmpComputerName] はコンピューター名
[ComputerName] 列を前方一致で検索している
戻り値は MaxTimeWritten に格納される
変数名は大文字小文字を区別することに注意!
戻り値を設定①
①「全般」を選択
②「単一行」を選択
SQL文の戻り値は「TimeWritten」値のうち最も新しい日時。つまり、単一行の値が返される。
戻り値を設定② 結果セットの設定 「結果セット」-「追加」をクリック 「結果名」に「0」を入力し、「変数名」から「<新しい変数>」を選択
戻り値を設定③ 変数の定義
SQL文も戻り値が格納される、MaxTimeWritten 変数を定義する
日付の形式を指定する 形式があっていれば適当な値でOK
変数のスコープはループ内のみでよいので「ソースごとに処理を繰り返
し」ループを選択してある
デバッグの実行①
「デバッグ開始」ボタンをクリックし、デバッグを開始する ループの頭でいったん停止するので、画面下部のローカルウゖンドウから[Valuables]-[User;;MaxTimeWritten]を右クリックして[ウォッチ式の追加]をクリック この時点では変数には初期値が格納されている。
デバッグの実行②
ウォッチ式の一覧に「User::MaxTimeWritten」が表示されたことを確認したら、「再開」ボタンでデバッグを再開する。
初期値
レコードが無いと「1899/12/30 0:00:00」が返される
デバッグの実行③ 全てが「緑」となり正常に完了することを確認する。
「イベントログを一括取得」部の作成 WMIを使用してリモートコンピューターのベントログを一括取得する。 取得したベントログはデータセットに格納される。
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ
「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::MaxTimeWritten] + "'"
• @[User::tmpLogFileName] は検索したいログフゔル名 • (DT_WSTR, 20) は 20バトのUnicode文字列 • @[User::MaxTimeWritten] は最も新しいレコードの書き込み日時
デバッグ①
「デバッグ開始」ボタンをクリックして、デバッグを開始する。 「ローカル」ウゖンドウから「User::WQL」を右クリックして「ウォッチ式の追加」を実行する。
デバッグ②
変数 User::WQL にWQL文が代入されていることを確認する
取得してくるログが多い場合、「ベントログの一括取得」はしばらく黄色のままになることがある。
「レコードを1件ずつ取り出し」部の作成
前項のゕウトプットであるベントログが格納されたデータセットを1行ずつ読み込むためのForEachループを作成する。取り出したレコードは各列を変数に格納する。
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ
※ループの作成のみ
Foreachループコンテナを配置する
コンテナ名を変更し優先順位制約の接続
引数の設定 ループの引数として、WMIの戻り値である User::EventDataを設定する
EventDataはデータセットが格納されている
引数の各カラム格納する変数を定義する 全てObject型で定義する。最終的に、次のページと同じくなるようにする。
間違えずに!
各変数はベントログの各カラムに対応しており、順番も各カラムの並び順
全てObject型
デバッグ デバッグを実行し、処理が正常に完了することを確認する。
「INSERT文を作成」部の作成
ここではSQL Serverに格納するためのInsert文をスクリプトタスクを使用して作成する。ベントログにはさまざまな文字列が含まれているため、SQL文エラーとならないよう簡単なVB.NETを使用して微調整する。
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成 ここ
スクリプトタスクの配置
「レコードを1件ずつ取り出し」ループに、「スクリプトタスク」を配置する
名称を「Insert文を作成」に変更する
スクリプト言語を「VB」に切り替える
変数を定義する①
「レコードを1件ずつ取り出す」ループをクリックし、「変数」ボックスを表示する。 以下の「変数の新規作成」ボタンをクリックして新しい変数を定義する。
スコープを「レコードを1件ずつ取り出す」にするということ
変数を定義する② InsertSQL変数を作成
この後のタスクで実行するSQL文が格納される変数。
引数を指定する
スクリプトタスクの引数として、前項「レコードを1件ずつ取り出し」で作成した変数すべてと、いま作成した InsertSQL を指定する。
引数を指定する②
スクリプト編集画面を開く
次ページ以降のスクリプトを入力する
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
変数を初期化 -----------------ここから
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, "'", "-") End If Dim strRecordNumber As String = "" If Not IsDBNull(Dts.Variables("User::RecordNumber").Value) Then strRecordNumber = Dts.Variables("User::RecordNumber").Value.ToString End If
変数を初期化
Message内のシンングルクオーテーションをハフンに置き換え
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
変数を初期化
変数を初期化 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
Dim strSQL As String = "INSERT INTO [LogReport].[dbo].[EventLogData_" & strLogfile & "] ([Category]" & _ ",[CategoryString]" & _ ",[ComputerName]" & _ ",[Data]" & _ ",[EventCode]" & _ ",[EventIdentifier]" & _ ",[EventType]" & _ ",[InsertionStrings]" & _ ",[LogFile]" & _ ",[Message]" & _ ",[RecordNumber]" & _ ",[SourceName]" & _ ",[TimeGenerated]" & _ ",[TimeWritten]" & _ ",[Type]" & _ ",[User])" & _
" VALUES('" & strCategory & "'," & _ "'" & strCategoryString & "'," & _ "'" & strComputerName & "'," & _ "'" & strData & "'," & _ "'" & strEventCode & "'," & _ "'" & strEventIdentifier & "'," & _ "'" & strEventType & "'," & _ "'" & strInsertionString & "'," & _ "'" & strLogfile & "'," & _ "'" & strMessage & "'," & _ "" & strRecordNumber & "," & _ "'" & strSourceName & "'," & _ "'" & strTimeGenerated & "'," & _ "'" & strTimeWritten & "'," & _ "'" & strType & "'," & _ "'" & strUser & "')"
SQL文を作成
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
生成したSQL文を、InsertSQL変数に格納 ここで作成したInsertSQLを、この後のタスクで実行する
-----------------ここまで
「INSERT INTOを実行」部の作成
作成したInsert文を実行してSQL Serverにデータを格納する
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
ベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
終了
Insert 文を生成
ここ