【DTS Tips】DTS パッケージをストアドプロシージャから実行する
DTS パッケージをストアドプロシージャから実行する
シナリオと要件
「DTS パッケージの実行をクライアントからキックしたい」
という要件がけっこうあるようです。
もちろん,DTS には DTSRUN ユーティリティが提供されており,DTS の実行をキックすることができます。
また,カスタムアプリケーションから,DTS のオブジェクトモデルを利用してキックすることも可能です。
しかし,上に書いた2つのアプローチでは,プッシュ型のキックになっており,クライアント側にコンポーネントのインストールが必要になってしまうのです。
そこででてくる要件が,データの転送をサーバー側からプルする形態です。
DTS パッケージをストアドプロシージャなどから呼び出すことができれば,クライアントには ADO や ADO.NET といった一般的なコンポーネントがあるだけで転送を実現できることになります。
この記事は,
SQL Server 2000 Developer Edition Service Pack 4
Data Transformation Services に基づいて記述しています。
一部セキュリティの設定を操作する必要があるため,利用する場合は自己責任でお願いします。
DTSRUN をプル型で利用する
[DTSRUN] は SQL Server のクライアントコンポーネントと共にインストールされるツールなので,通常はサーバーにもインストールされています。
これを利用して,サーバー側で [DTSRUN] をコマンド実行するストアドプロシージャを公開してあげることで要件を実現することができます。
1 [xp_CmdShell] 拡張ストアドプロシージャに渡す,[DTSRUN] の実行コマンドを作成する。
2 [xp_CmdShell] に [DTSRUN] 実行コマンドを引き渡すストアドプロシージャを作成する。
3 クライアント側からストアドプロシージャをコールする。
この方法の問題点は,
- [xp_CmdShell] の実行には特別な権限が必要になる
- [xp_CmdShell] の実行権限は非常に強力で,セキュリティ上の大問題になる
ことです。
この問題点を解決する方法はいくつかありますが,
「OPENROWSET を利用して実行権限を上昇させる」などを参照してください。
SQL Server Agent を利用する
[DTS パッケージ] の実行には [DTSRUN] を利用するのが順当ですが,裏口とでも言える方法があります。
それが,[SQL Server Agent] の [ジョブ] を利用する方法です。
[ジョブ] は標準で外部からコールするストアドプロシージャが用意されているのです。
[DTS パッケージ] をウィザードで作成すると,保存の際に [実行時期] オプションに [あとで実行するために DTS パッケージをスケジュール] という選択肢があります。
これを利用すると,外部からストアドプロシージャで呼び出し可能になるパッケージを簡単に作成することができます。
1 [DTS パッケージ] をウィザードで作成する。
2 [あとで実行するために DTS パッケージをスケジュール] をチェックして,右側のビルドボタンをクリックする。
実際にスケジュールする必要はないでしょうから,[実行間隔] などの情報を変更する必要はありません。
ここで,[開始日] と [終了日] を現在の日付より古い日付に指定します。
こうすることによって,スケジュールとしては実行されないジョブを作成することができます。
3 [DTS パッケージ] の名前と同じジョブが作成されます。
4 [sp_start_job] ストアドプロシージャを利用して作成したジョブを呼び出すストアドプロシージャを公開する。
5 クライアント側からストアドプロシージャをコールする。
CREATE PROCEDURE [ExecPack] AS
EXECUTE msdb..sp_start_job @job_name = 'Test'
GO
これで,外部から呼び出し可能な [DTS パッケージ] を [ストアドプロシージャ] を介して公開できます。
ただし,この方法を用いるためにも,[msdb] へのアクセス権及び公開するストアドプロシージャの実行権限をクライアントに与える必要があります。
システムデータベースにアクセスさせてしまうので,セキュリティ上の問題となることがあります。
もちろん,これを実行するためには,[SQL Server Agent] が起動されていることが必要ですし,[サービスアカウント] の権限の確認が必須です。
  ヒント 
パッケージを実行するジョブの中身
出来上がった [ジョブ] の中身を覗くと,[DTSRUN] をキックする [ステップ] が定義されているのがわかります。
結局は内部的に [DTSRUN] を利用しているだけなんですね。
[SQL Server Agent] のサービスアカウント
[ジョブ] を利用すると,[DTS パッケージ] の実行コンテキストが,[SQL Server Agent] のサービスアカウントになります。
プル型のパッケージ実行を行う場合は,ソースデータのアクセス権をこのサービスアカウントが持っている必要があります。