我对这个问题的解决方案是设计时值总是指向开发环境。任何开发人员打开包,它都会针对该环境进行验证,一切都很好。
在 dev 之外运行包意味着它们是通过 SQL 代理运行的。如果您可以精确控制该级别,那么创建作业以指向正确的配置存储库是一件简单的事情。
在物理实现上,我使用了每个环境的自定义 ssis 目录 (SYSDB),其中包含我们的配置、日志框架 + 标准日志表 (sysdtslog90/sysssislog)。每个包都需要有一个变量User::Default_ConfigurationServer,并且该变量用作配置连接管理器的 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
现在,无论我的作业是在哪里创建的,它都会将该变量指向正确的位置,这反过来又会导致包发现正确的存储库,而我要做的工作就更少了。