トップ回答者
SSIS パッケージを実行する時に、/SET で dtsConfig のパスを書き換える方法

質問
-
いつも助けて頂いています。
環境: SQLServer2008
SSIS パッケージ(.dtsx ファイル)を dtexec で実行する際に、外部の dtsConfig ファイル(パッケージ構成)を
再読み込みさせたいのですが、/SET オプションでの具体的な指定方法が判らず困っています。SQLServer2008 以降では、dtexec のコマンドライン適用後に、再度デザイン時構成を読み込むように仕様が
変わっており、その為、 /CONFIGFILE オプションを使って、デザイン時構成の値を書き換える事ができなく
なっています。http://msdn.microsoft.com/ja-jp/library/bb500430(v=SQL.100).aspx
しかし上記 URL によると、/CONNECTION と /SET で指定する事によって、再度デザイン時構成を読み込む場合
の読み込み先を指定できるような記述があります。
ところが、/SET で具体的にどう記載すればよいのかが判りません。.dtsx ファイルの ConfigurationString タグの内容を設定するようなイメージだと思うのですが、
どうも /SET の使い方をインターネットで調べても、Properties 配下の変数やプロパティを指定するような例
ばかりで、見当たりません。
VisualStudio の構成ウィザードの1ページ目に指定するパスの部分の話なので、構成ウィザードの最終画面に
出力されるパスとも違いますし、手詰まり気味です。情報をお持ちの方、何卒よろしくお願いいたします。
回答
-
以前、まったく同じ現象にハマり、同じことを考えたことがあるので投稿します。
まず、dtsxファイルに定義されているConfigurationString(dtsConfigファイルへのPATH) は、dtexecの実行時に、書き換えることができません。
また、/Set オプションは、主にVariable値をはじめ、データベースやフラットファイルの接続先となるConnectionStringを書き換える時に
使用するものであるため、dtsxファイル内に設定されているConfigurationStringを/Setオプションで書き込むことはできません。
もし、dtsxファイルのConfigurationString の値(dtsConfigへのPATH)を書き換えたい場合は、
実行時ではなく、配置時にやるしかありません。
そのため、動的にConfigurationStringを書き換えるには、DTEXEC実行前に下記のいずれかの方法を使って
ConfigurationStringを書き換えるしか対処方法はありません。
以下、dtsxパッケージファイルをファイルシステムとして保存した場合の対処例をいくつかご紹介します。
■例1:DeploymentManifestファイルを使う場合
Visual Studio でSSISプロジェクトのプロパティを開き、[配置ユーティリティ]の[CreateDeploymentUtility]をTrueに設定し、ビルドします。
その後、出来上がったbin\Deploymentフォルダをリリース先のサーバーにコピーし、
*.SSISDeploymentManifestファイルをDTEXEC実行前に自動実行させる仕組みを用意します。
具体的には、*.SSISDeploymentManifestファイルの実行は、DTSInstall.exeを使って
実行することができます。
http://msdn.microsoft.com/ja-jp/library/ms141693(SQL.100).aspx
この利点を使って、DTSInstall.exe → DTEXEC の順番で実行できるようなBATファイルを用意すると良いです。
*.SSISDeploymentManifestファイルを実行すると、[インストール先]を指定できるオプション(画面)がありますので
dtsxファイルのConfigurationStringの値を書き換えることができます。
ただし、DeploymentManifestファイルでデプロイ(配置)すると、dtsxファイルとdtsConfigファイルは同一フォルダに
配置されてしまう欠点がありますので、dtsxファイルとdtsConfigファイルで配置先が違う場合は、使えません。■例2:PowerShell等を使って、dtsxファイルを直接変更する方法。
下記のようなPowerShellを用意し、DTEXEC実行前にPowerShellをコールする仕組みにします。$dtsxFilePath = "c:\work\hoge.dtsx" $configFile = "c:\work\config\hoge.dtsConfig" [reflection.assembly]::LoadFile("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll") > $null $app = New-Object "Microsoft.SqlServer.Dts.Runtime.Application" $package = $app.LoadPackage($dtsxFilePath, $null) $config = $package.Configurations[0] $config.ConfigurationString = $configFile $app.SaveToXml($dtsxFilePath, $package, $null)
このような回避方法で、ConfigurationString の値を動的に変更することは可能です。
例1同様、上記PowerShellの呼び出し(powershell.exeで上記スクリプトをキック) → DTEXEC の順番で
実行できるようなBATファイルを用意すると良いです。かなり面倒ではありますが、DTEXECだけでは、ConfigurationStringの値を変更することはできないので、
上記のような工夫が必要だと思われます。
また、実行環境が許すのであれば、例2の方法が個人的にはお勧めです。参考になるかわかりませんが、ご検討いただけると幸いです。
けろ-みお Blog:http://techbank.jp/mymio/ HP:http://techbank.jp/
すべての返信
-
以前、まったく同じ現象にハマり、同じことを考えたことがあるので投稿します。
まず、dtsxファイルに定義されているConfigurationString(dtsConfigファイルへのPATH) は、dtexecの実行時に、書き換えることができません。
また、/Set オプションは、主にVariable値をはじめ、データベースやフラットファイルの接続先となるConnectionStringを書き換える時に
使用するものであるため、dtsxファイル内に設定されているConfigurationStringを/Setオプションで書き込むことはできません。
もし、dtsxファイルのConfigurationString の値(dtsConfigへのPATH)を書き換えたい場合は、
実行時ではなく、配置時にやるしかありません。
そのため、動的にConfigurationStringを書き換えるには、DTEXEC実行前に下記のいずれかの方法を使って
ConfigurationStringを書き換えるしか対処方法はありません。
以下、dtsxパッケージファイルをファイルシステムとして保存した場合の対処例をいくつかご紹介します。
■例1:DeploymentManifestファイルを使う場合
Visual Studio でSSISプロジェクトのプロパティを開き、[配置ユーティリティ]の[CreateDeploymentUtility]をTrueに設定し、ビルドします。
その後、出来上がったbin\Deploymentフォルダをリリース先のサーバーにコピーし、
*.SSISDeploymentManifestファイルをDTEXEC実行前に自動実行させる仕組みを用意します。
具体的には、*.SSISDeploymentManifestファイルの実行は、DTSInstall.exeを使って
実行することができます。
http://msdn.microsoft.com/ja-jp/library/ms141693(SQL.100).aspx
この利点を使って、DTSInstall.exe → DTEXEC の順番で実行できるようなBATファイルを用意すると良いです。
*.SSISDeploymentManifestファイルを実行すると、[インストール先]を指定できるオプション(画面)がありますので
dtsxファイルのConfigurationStringの値を書き換えることができます。
ただし、DeploymentManifestファイルでデプロイ(配置)すると、dtsxファイルとdtsConfigファイルは同一フォルダに
配置されてしまう欠点がありますので、dtsxファイルとdtsConfigファイルで配置先が違う場合は、使えません。■例2:PowerShell等を使って、dtsxファイルを直接変更する方法。
下記のようなPowerShellを用意し、DTEXEC実行前にPowerShellをコールする仕組みにします。$dtsxFilePath = "c:\work\hoge.dtsx" $configFile = "c:\work\config\hoge.dtsConfig" [reflection.assembly]::LoadFile("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll") > $null $app = New-Object "Microsoft.SqlServer.Dts.Runtime.Application" $package = $app.LoadPackage($dtsxFilePath, $null) $config = $package.Configurations[0] $config.ConfigurationString = $configFile $app.SaveToXml($dtsxFilePath, $package, $null)
このような回避方法で、ConfigurationString の値を動的に変更することは可能です。
例1同様、上記PowerShellの呼び出し(powershell.exeで上記スクリプトをキック) → DTEXEC の順番で
実行できるようなBATファイルを用意すると良いです。かなり面倒ではありますが、DTEXECだけでは、ConfigurationStringの値を変更することはできないので、
上記のような工夫が必要だと思われます。
また、実行環境が許すのであれば、例2の方法が個人的にはお勧めです。参考になるかわかりませんが、ご検討いただけると幸いです。
けろ-みお Blog:http://techbank.jp/mymio/ HP:http://techbank.jp/ -
ちなみに、/Set オプションの使い方は単純です。
DTEXEC /File hoge.dtsx
/Set \Package.Variables[User::変数名].Properties[Value];"適用したい値"
/Set \Package.Variables[User::変数名].Properties[Value];"適用したい値" ....でいけると思います。dtsConfig から読み込ませる予定だった変数の種類数が少ない場合は、
上記でご案内したdtsConfigのPATH(ConfigurationString)を書き換えるよりかも
リスクは少なく済むと思います。ご検討ください。
けろ-みお Blog:http://techbank.jp/mymio/ HP:http://techbank.jp/