在SSIS中动态更改服务器名称

时间:2012-06-22 13:31:53

标签: sql deployment ssis

我的SSIS包在开发周期(开发,QA,分段和生产)中有几个环境,因此我想在SSIS中使用配置在我的连接管理器中设置服务器名称,以便我不需要手工完成。

我已经阅读过有关使用xml配置文件,SQL配置表和环境变量的信息。但是我遇到的问题是我的QA和Staging环境位于同一台服务器上,但是使用了两个独立的SQL实例。如何在此实例中动态配置服务器名称?

3 个答案:

答案 0 :(得分:2)

好的,这就是我们的处理方式。我们使用环境变量来确定数据库以从中读取其余的配置。环境变量与用户相关联,因此我们将QA的作业设置为一个用户,将作业设置为另一个用户。我们的用户称为SQLQA和SQLstaging,仅用于运行作业。然后环境变量指向我们在SSIS配置中存储其余配置的数据库。

答案 1 :(得分:0)

您仍然可以使用一个配置文件进行QA和暂存。在文件中包含两个服务器。

然后,当您构建执行包的QA进程时,包含一个可选的运行时参数,该参数获取您希望包执行的特定环境,并在包的开头使用一个小脚本任务来设置适当的变量(甚至只是动态变量)。

它并不完美,但它至少应该让你在不同的环境中执行,而不必更改包本身。

答案 2 :(得分:0)

我对此问题的解决方案是设计时间值始终指向开发环境。任何开发人员都会打开包,它会针对该环境进行验证,并且一切都很好。

在dev之外运行包意味着它们是通过SQL Agent运行的。如果您可以确定该控制级别,那么创建作业以指向正确的配置存储库就是一件简单的事情。

物理实现,我使用了每个环境(SYSDB)的自定义ssis目录,它包含我们的配置,日志框架+标准日志记录表(sysdtslog90 / sysssislog)。每个包都需要有一个变量User::Default_ConfigurationServer,并且该变量在Configuration Connection Manager的ConnectionString属性中用作表达式。听起来很复杂,但不是---

  1. 创建一个string
  2. 类型的变量
  3. 复制配置的值 连接管理器的连接字符串并将其粘贴为值
  4. 将表达式分配回配置连接管理器 ConnectionString属性
  5. 开发中的净效果是它什么都不做,但现在你可以让它在其他环境中运行。我的经纪人看起来像

    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
    

    现在,无论我的作业在何处创建,它都会将该变量指向正确的位置,从而导致包发现正确的存储库,而且我的工作量也很少。