none
FTPタスクのパスワードを動的に設定するために RRS feed

  • 質問

  • SSISのFTPタスクを利用しています。

    2点ほど実装したい仕様のポイントがありまして、
    1. FTP接続のエラーとFTPでのファイル操作のエラーを別々に処理したい
    2. パスワードを含める接続用のプロパティを、パッケージ構成ファイルに外出しにしたい、
    という2点です。

    接続できたかどうかを検証するためには、ファイル操作しか機能がないFTPタスクではできないので、
    スクリプトタスクの中で、FtpWebRequestオブジェクトなどを使って実現しようとしています。
    これ自体はうまくいきました。

    そこで、このスクリプト内で使用するFTPの接続情報を変数に出しておいて、
    FTP接続マネージャのプロパティでも再利用しようと思い、
    FTP接続マネージャの Expressions にそれぞれ変数から渡してみようと考えました。

    ところがここで問題が発生しまして、
    どうやらFTP接続マネージャのServerPassowrdプロパティは、Expressionsからは渡すことができず、
    これは、直接パッケージ構成ファイルからの設定しか受け付けてくれないようなのです。

    このため、今のところ上記の仕様を実現しようと思うと、
    FTPのパスワードの設定を、パッケージ構成ファイルに対して、
    変数用と、FTP接続マネージャのExpressions用の2つを用意しなければならないことになります。

    この2つの仕様を満たし、かつ、パッケージ構成ファイルへのパスワードの指定を1つにする、
    ということは可能でしょうか。

    あるいは、この仕様が満たせれば、実装方法は問いません。
    何か代替案がありましたらご教授願います。


    また、ちょっと付属の質問になりますが、SSISではスクリプトタスク内から
    直接各タスクのプロパティにアクセスする方法は用意されてないのでしょうか。
    (最初は上記の仕様をこれで試みようとしていました)


    以上、ご回答ご教授の程よろしくお願いいたします。


    環境:
    SQL Server 2005 SP2(または SPなし)
    Windows Server 2003

    2009年7月10日 17:07

回答

  • スクリプトタスクにて

     Dim cm As ConnectionManager = Dts.Connections("FTP接続マネージャの名前")
     cm.Properties("ServerPassword").SetValue(cm, Dts.Variables("パスワード文字列の変数の名前").Value)

    という感じでしょうか。
    • 回答としてマーク soony1st 2009年7月11日 4:41
    2009年7月11日 0:09

  • Microsoft.SqlServer.Dts.Tasks.ScriptTask の ScriptObjectModel クラス
    http://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.tasks.scripttask.scriptobjectmodel_members.aspx

    Dts オブジェクトに、既存の"タスク"にアクセスできるプロパティのが無いので("接続"や"変数"はある)、
    スクリプトタスクの中からは無理だと思われます。
    変数に入れて Expressions の機能を利用することになるのではないでしょうか。
    • 回答としてマーク soony1st 2009年7月11日 4:41
    2009年7月11日 3:26

すべての返信

  • スクリプトタスクにて

     Dim cm As ConnectionManager = Dts.Connections("FTP接続マネージャの名前")
     cm.Properties("ServerPassword").SetValue(cm, Dts.Variables("パスワード文字列の変数の名前").Value)

    という感じでしょうか。
    • 回答としてマーク soony1st 2009年7月11日 4:41
    2009年7月11日 0:09
  • 早速のご回答ありがとうございます。

    仰る方法で、うまく動きました。
    おかげさまで、仕様を満たす実装ができました。
    ありがとうございました。

    ところで、ちょっと本題からは外れたついでの質問になるのですが、
    接続マネージャ系のオブジェクトには、Dts.Connections が使えることは分かりました。
    そこで、他のタスクにも同じように窓口的なプロパティが用意されているのではないかと思ったのですが、
    それを見つけることができませんでした。

    たとえば、FTPタスクそのものにもいろいろプロパティがありますが、LocalPath や、Disable などといった、
    タスク系についているプロパティにアクセスするための仕組みも、何か用意されているのでしょうか。

    ご教授の程よろしくお願いいたします。
    2009年7月11日 1:09

  • Microsoft.SqlServer.Dts.Tasks.ScriptTask の ScriptObjectModel クラス
    http://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.tasks.scripttask.scriptobjectmodel_members.aspx

    Dts オブジェクトに、既存の"タスク"にアクセスできるプロパティのが無いので("接続"や"変数"はある)、
    スクリプトタスクの中からは無理だと思われます。
    変数に入れて Expressions の機能を利用することになるのではないでしょうか。
    • 回答としてマーク soony1st 2009年7月11日 4:41
    2009年7月11日 3:26
  • 変数に入れて Expressions の機能を利用することになるのではないでしょうか。
    やはりそれしかないんですね。

    SSISの理解が乏しいため、だんだんと作り込みが面倒になってきて、
    もしも各タスクをスクリプトでも制御できるなら、
    もういっそのこと、全部コーディングしてしまおうかと考えて、
    この質問が浮かんできました。

    #ならばSSISなど使わずに・・・と聞こえそうですが、
    お仕事なので選択権がありません。。。

    とはいえ、これで出来ることと出来ないことがはっきりしましたので、
    それだけでも大きな収穫でした。

    どうもありがとうございました。
    2009年7月11日 4:38
  • すいません書きそびれてしまいましたが
    一応ご参考までに。

    Integration Services クラスライブラリ
    http://technet.microsoft.com/ja-jp/library/cc194728(SQL.90).aspx
    例えば Microsoft.SqlServer.Dts.Tasks.FtpTask の Operation プロパティ
    http://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.tasks.ftptask.ftptask.operation.aspx

    にあるように、
    microsoft.sqlserver.ftptask.dll を参照すれば、例えば VB.NET で

    Dim pkg As Package =  New Package() 
    Dim exec1 As Executable =  pkg.Executables.Add("STOCK:FTPTask") 
    Dim th As TaskHost =  exec1 as TaskHost
    th.Properties["Operation"].SetValue(th, DTSFTPOp.Receive);
    (このコードは2番目のURLから引用)

    というようなことが可能なはずです。
    「SSIS で処理を行う中でプロパティ設定をコードで行う」のではなく
    「プログラムにて SSIS の機能を利用する」形式になりますが。
    2009年7月11日 8:49