TimberLandChapelのTech Blog

TimberLandChapel が提供する技術Tips,思いつきメモ,雑感ブログです。
Office 互換リボン Release 1.0 をリリースしました。

購読

今期のアンケート

INETAJ

Microsoft

SQL Server

TLC.com

クリエイティブ・コモンズ

情報処理関係官公庁

【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] をコマンド実行するストアドプロシージャを公開してあげることで要件を実現することができます。

[xp_CmdShell] 拡張ストアドプロシージャに渡す,[DTSRUN] の実行コマンドを作成する。

[xp_CmdShell] に [DTSRUN] 実行コマンドを引き渡すストアドプロシージャを作成する。

クライアント側からストアドプロシージャをコールする。

この方法の問題点は,

  • [xp_CmdShell] の実行には特別な権限が必要になる
  • [xp_CmdShell] の実行権限は非常に強力で,セキュリティ上の大問題になる
ことです。
この問題点を解決する方法はいくつかありますが,
「OPENROWSET を利用して実行権限を上昇させる」などを参照してください。

SQL Server Agent を利用する

[DTS パッケージ] の実行には [DTSRUN] を利用するのが順当ですが,裏口とでも言える方法があります。
それが,[SQL Server Agent] の [ジョブ] を利用する方法です。
[ジョブ] は標準で外部からコールするストアドプロシージャが用意されているのです。

[DTS パッケージ] をウィザードで作成すると,保存の際に [実行時期] オプションに [あとで実行するために DTS パッケージをスケジュール] という選択肢があります。
これを利用すると,外部からストアドプロシージャで呼び出し可能になるパッケージを簡単に作成することができます。

[DTS パッケージ] をウィザードで作成する。

[あとで実行するために DTS パッケージをスケジュール] をチェックして,右側のビルドボタンをクリックする。

実際にスケジュールする必要はないでしょうから,[実行間隔] などの情報を変更する必要はありません。
ここで,[開始日] と [終了日] を現在の日付より古い日付に指定します。
こうすることによって,スケジュールとしては実行されないジョブを作成することができます。

[DTS パッケージ] の名前と同じジョブが作成されます。

[sp_start_job] ストアドプロシージャを利用して作成したジョブを呼び出すストアドプロシージャを公開する。

クライアント側からストアドプロシージャをコールする。

ジョブを開始するストアドプロシージャ
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] のサービスアカウントになります。
プル型のパッケージ実行を行う場合は,ソースデータのアクセス権をこのサービスアカウントが持っている必要があります。

Published 2006年4月13日 12:15 投稿者 timberlandchapel

コメント

コメントはありません