【问题标题】:Dynamically Changing Server Names in SSIS在 SSIS 中动态更改服务器名称
【发布时间】:2012-06-25 21:32:50
【问题描述】:

我的 SSIS 包在开发周期(开发、质量保证、暂存和生产)中有几个环境需要通过,因此我想使用 SSIS 中的配置在我的连接管理器中设置服务器名称,以便我不需要手动执行此操作。

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

【问题讨论】:

    标签: sql deployment ssis


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您仍然可以将一个配置文件用于 QA 和 Staging。在文件中包含两台服务器。

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        1. 创建一个字符串类型的变量
        2. 复制配置的值 连接管理器的连接字符串并将其粘贴为值
        3. 将表达式分配回配置连接管理器的 连接字符串属性

        开发中的净效应是它什么都不做,但现在你可以让它在其他环境中工作。我的经纪人看起来都像

        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
        

        现在,无论我的作业是在哪里创建的,它都会将该变量指向正确的位置,这反过来又会导致包发现正确的存储库,而我要做的工作就更少了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多