在不同的服务器上使用 SSIS 环境变量

Using SSIS Environment variable on different servers

我已经阅读了几篇关于环境变量的文章,但我找不到如何在我的案例中应用它们的用法。我正在我的本地机器上开发 SSIS 包。完成后,我计划将它们部署到暂存生产服务器上。我的 SSIS 项目由几个包组成,其中大部分连接到 2 个数据库(但每个服务器都有自己的数据库副本)和几个 excel 文件。

所以,我想将我的包部署到 3 个不同的服务器。基于服务器,连接字符串会有所不同。由于这仍处于开发阶段,因此我不得不时不时地重新部署大多数包。实现这一目标的最佳做法是什么?

正在创建您的文件夹

Integration Services Catalog 中,在 SSISDB 下,右键单击并创建一个文件夹并为其命名,但不要 单击确定。相反,单击“脚本”、“新建查询编辑器”Window。这给出了类似

的查询
DECLARE @folder_id bigint
EXEC [SSISDB].[catalog].[create_folder]
    @folder_name = N'MyNewFolder'
,   @folder_id = @folder_id OUTPUT
SELECT
    @folder_id
EXEC [SSISDB].[catalog].[set_folder_description]
    @folder_name = N'MyNewFolder'
,   @folder_description = N''

运行 然后保存它,以便您可以在服务器 2 和服务器 3 上创建相同的文件夹。顺便说一句,这将是一个主题

正在创建您的环境

刷新 SSISDB 下的下拉列表并找到您新创建的文件夹。展开它并在环境下,右键单击并创建新环境。给它一个名字和描述,但不要点击确定。相反,单击脚本、新建查询编辑器 Window。

我们现在有了这个代码

EXEC [SSISDB].[catalog].[create_environment]
    @environment_name = N'DatabaseConnections'
,   @environment_description = N''
,   @folder_name = N'MyNewFolder'

运行 并保存它以部署到服务器 2 和 3。

向环境添加值

刷新环境树,在新创建的环境的属性 window 下,单击变量选项卡并为连接字符串或其他内容添加条目。这是您真的 真的 不想单击“确定”的地方。相反,单击脚本、新建查询编辑器 Window。

DECLARE @var sql_variant = N'ITooAmAConnectionString'
EXEC [SSISDB].[catalog].[create_environment_variable]
    @variable_name = N'CRMDB'
,   @sensitive = False
,   @description = N''
,   @environment_name = N'DatabaseConnections'
,   @folder_name = N'MyNewFolder'
,   @value = @var
,   @data_type = N'String'
GO
DECLARE @var sql_variant = N'IAmAConnectionString'
EXEC [SSISDB].[catalog].[create_environment_variable]
    @variable_name = N'SalesDB'
,   @sensitive = False
,   @description = N''
,   @environment_name = N'DatabaseConnections'
,   @folder_name = N'MyNewFolder'
,   @value = @var
,   @data_type = N'String'
GO

运行那个查询然后保存。现在,当您部署到环境 2 和 3 时,只需更改 @var

的值

配置

至此,我们只是成功地为我们的包设置了一组一致的文件夹、环境和变量。现在我们需要针对一组包实际 使用 它们。这将假定您的包已部署到上述步骤和现在之间的文件夹中。

右击package/project进行配置。您很可能想要该项目。

  1. 单击“引用”选项卡。添加...并使用 DatabaseConnections,或任何您命名的
  2. 单击返回参数。单击连接管理器选项卡。找到连接管理器并在连接字符串中单击省略号并将其更改为 "Use Environment Variable" 并找到您的值
  3. 请勿单击“确定”!脚本 -> 新查询编辑器 Window

此时,您将拥有一个脚本,该脚本添加对环境变量的引用(以便您可以使用它),然后用环境中的值覆盖存储的包值。

DECLARE @reference_id bigint
EXEC [SSISDB].[catalog].[create_environment_reference]
    @environment_name = N'DatabaseConnections'
,   @reference_id = @reference_id OUTPUT
,   @project_name = N'HandlingPasswords'
,   @folder_name = N'MyNewFolder'
,   @reference_type = R
SELECT
    @reference_id

GO
EXEC [SSISDB].[catalog].[set_object_parameter_value]
    @object_type = 30
,   @parameter_name = N'CM.tempdb.ConnectionString'
,   @object_name = N'ClassicApproach.dtsx'
,   @folder_name = N'MyNewFolder'
,   @project_name = N'HandlingPasswords'
,   @value_type = R
,   @parameter_value = N'SalesDB'
GO

此脚本应保存并用于服务器 2 和 3。

工作

所有这些都是为了让您拥有可用的配置。当您从作业安排包执行时,您将以如下作业步骤结束

EXEC msdb.dbo.sp_add_jobstep
    @job_name = N'Demo job'
,   @step_name = N'SSIS job step'
,   @subsystem = N'SSIS'
,   @command = N'/ISSERVER "\"\SSISDB\MyNewFolder\HandlingPasswords\ClassicApproach.dtsx\"" /SERVER "\".\dev2014\"" /ENVREFERENCE 1 /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
  • 命令显然是最重要的部分。
  • 我们正在 运行打包 ClassicApproach
  • 运行 这在当前服务器上有一个 Dev2014 的实例
  • 使用环境参考 1
  • 我们使用标准日志级别。
  • 这是一个同步调用,意味着代理将等到包完成后再进入下一步

环境参考

您会注意到以上所有内容都很好,并且指定了文本字符串而不是随机整数值,但我们的环境参考除外。那是因为您可以为多个文件夹中的环境使用相同的文本名称。类似于将同一个项目部署到多个文件夹,但出于某种原因,SSIS 开发人员选择提供包的完全限定路径,而我们使用 "random" 整数值。要确定您的环境 ID,您可以 运行 以下查询

SELECT
    ER.reference_id AS ReferenceId
,   E.name AS EnvironmentName
,   F.name AS FolderName
,   P.name AS ProjectName
FROM
    SSISDB.catalog.environments AS E
    INNER JOIN
        SSISDB.catalog.folders AS F
        ON F.folder_id = E.folder_id
    INNER JOIN 
        SSISDB.catalog.projects AS P
        ON P.folder_id = F.folder_id
    INNER JOIN
        SSISDB.catalog.environment_references AS ER
        ON ER.project_id = P.project_id
ORDER BY 
    ER.reference_id;

或浏览 Folder/Environments 下的集成服务目录,然后双击所需的环境。在生成的环境属性 window 中,名称和标识符将变灰,这是您需要在 SQL 代理的作业步骤命令中使用的 Identifier 属性 值对于 /ENVREFERENCE 值。

总结

如果您小心并保存向导为您做的每一件事,那么在整个环境中迁移更改时,您只有一件必须更改的事情。这将导致干净、流畅、可重复的迁移过程,并且您想知道为什么您想要返回到 XML 文件或任何其他配置方法。

如果您正在为此寻找无代码解决方案,可以尝试 Visual Studio Marketplace 中的 SSIS 目录迁移向导。

您可以将 SSIS 项目、环境、环境引用、项目和包参数的默认值等从选定的目录文件夹迁移到其他服务器,甚至迁移到 Azure SSIS 运行时。

了解更多信息 here or watch this short video