TimberLandChapel's Tech Blog

TimberLandChapel provide Tips, tech note and scribbling.
Updated my site as English site for APAC users.
TLC.com .Metrix 4.0 Beta1 released

サイトの日本語化方法はこちら

Syndication

News

INETAJ

情報処理関係官公庁

SQL Server

TLC.com

Microsoft

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

http://www3.clustrmaps.com/

4月 2006 - Posts

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 by timberlandchapel | with no comments
Filed under:
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 by timberlandchapel | with no comments
Filed under: