在不同的服务器上使用 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进行配置。您很可能想要该项目。
- 单击“引用”选项卡。添加...并使用 DatabaseConnections,或任何您命名的
- 单击返回参数。单击连接管理器选项卡。找到连接管理器并在连接字符串中单击省略号并将其更改为 "Use Environment Variable" 并找到您的值
- 请勿单击“确定”!脚本 -> 新查询编辑器 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 运行时。
我已经阅读了几篇关于环境变量的文章,但我找不到如何在我的案例中应用它们的用法。我正在我的本地机器上开发 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进行配置。您很可能想要该项目。
- 单击“引用”选项卡。添加...并使用 DatabaseConnections,或任何您命名的
- 单击返回参数。单击连接管理器选项卡。找到连接管理器并在连接字符串中单击省略号并将其更改为 "Use Environment Variable" 并找到您的值
- 请勿单击“确定”!脚本 -> 新查询编辑器 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 运行时。