この問題に対する私の解決策は、設計時の値が常に開発環境を指すようにすることでした。開発者は誰でもパッケージを開き、その環境に対して検証し、すべて問題ありません。
dev の外でパッケージを実行するということは、パッケージが SQL エージェントを介して実行されることを意味していました。そのレベルの制御を正確に行うことができれば、正しい構成リポジトリを指すようにジョブを作成するのは簡単なことです。
物理的に実装された、構成、ログ フレームワーク + 標準ログ テーブル (sysdtslog90/sysssislog) を保持する環境 (SYSDB) ごとのカスタム ssis カタログを使用しました。すべてのパッケージには変数が必要でありUser::Default_ConfigurationServer
、その変数は Configuration Connection Manager の ConnectionString プロパティの式として使用されていました。複雑に聞こえますが、そうではありません---
- 文字列型の変数を作成する
- 構成接続マネージャーの接続文字列の値をコピーし、それを値として貼り付けます
- 構成接続マネージャーの ConnectionString プロパティに式を割り当てます。
開発における最終的な効果は、それが何もしないということですが、今では他の環境で動作させることができます. 私のエージェントはすべて次のように見えます
DECLARE @serverName sysname
, @jobstep_command nvarchar(4000)
-- Lots of other stuff removed
SET @serverName = @@servername
SET @jobstep_command = N'/SQL "\MyPackage"' + '" /SERVER "' + @serverName + '" /CHECKPOINTING OFF /REPORTING E /SET "\Package.Variables[User::Default_ConfigurationServer].Properties[Value]";"\"Provider=SQLNCLI10;Data Source=' + @serverName + ';Initial Catalog=SYSDB;Integrated Security=SSPI;\""'
-- create the job, also removed
-- Create the job step
EXECUTE @return_code = msdb.dbo.sp_add_job
@job_name = @job_name
, @enabled = @job_enabled
, @description = @job_description
, @start_step_id = @job_start_step
, @category_name = @category_name
--, @category_id = @category
, @owner_login_name = @job_owner_login_name
, @notify_level_eventlog = @job_notify_level_eventlog
, @notify_level_email = @job_notify_level_email
, @notify_level_netsend = @job_notify_level_netsend
, @notify_level_page = @job_notify_level_page
, @notify_email_operator_name = @job_notify_email_operator_name
, @notify_netsend_operator_name = @job_notify_netsend_operator_name
, @notify_page_operator_name = @job_notify_page_operator_name
, @delete_level = @job_delete_level
, @job_id = @job_id OUTPUT
これで、ジョブが作成された場所に関係なく、その変数が正しい場所を指すようになり、パッケージが正しいリポジトリを検出するようになり、作業が減りました。