TimberLandChapelのTech Blog

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

購読

今期のアンケート

INETAJ

Microsoft

SQL Server

TLC.com

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

情報処理関係官公庁

4月 2006 - 投稿

http://www.exconn.net/Blogs/team00/services/trackbacks/9822.aspx

沼口さんのブログです。

非常にモチベーションのあがるメッセージを提供していただきました。

ゲイツ氏のビデオレターも一般非公開ながら撮ってこられた皆さんの特攻に乾杯。

これからもがんばります。

 

SQL Server 2005 Service Pack1 の提供がいよいよ始まりました。

Microsoft ダウンロードセンターから入手することができます。

SQL Server 2005 Service Pack 1
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=CB6C71EA-D649-47FF-9176-E7CAC58FD4BC

SQL Server 2005 Express Edition Service Pack 1
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=11350B1F-8F44-4DB6-B542-4A4B869C2FF1

これからバグの Fix 状況をみないといけないですね。

 

Posted 投稿者 timberlandchapel | : no comments
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] のサービスアカウントになります。
プル型のパッケージ実行を行う場合は,ソースデータのアクセス権をこのサービスアカウントが持っている必要があります。

TLC が普段 VB.NET のプロジェクトを担当する際に守っている自分なりのコーディングガイドラインを少しまとめて,

ベスト? プラクティスとして,TLC.com コーディングガイドラインとしてベータ公開します。

多くの方からのコメントを頂けるとありがたいです。

TimberLandChapel.com コーディングガイドライン for VB.NET (β1)
http://blogs.timberlandchapel.com/guideline.zip

TLC が提供するソースコードはこちらのガイドラインに沿って提供していきます。

 

Posted 投稿者 timberlandchapel | : no comments
タグ :