在ssis中参数化连接管理器的目的是什么?

What is the purpose of parameterizing connection manager in ssis?

我有带有 2 个连接管理器的 ssis 包。

部署到 sql 服务器时,当我右键单击并单击“执行”时,它允许我设置连接管理器配置值。

同样在上面的弹出窗口中我可以设置参数值。

同样,我可以右键单击并选择配置来设置参数和连接管理器值。

那么当我无论如何都可以通过弹出窗口配置连接管理器时,在 ssis 中参数化连接管理器的目的到底是什么?

参数是包可以在 运行 时间接收的只读变量。包裹级别参数的一个示例类似于处理日期。这样我就可以 运行 昨天的工作,然后重新 运行 包含今天日期的包裹。

也可以在 运行 时设置变量,但这样做的机制不太直观。最终结果是一样的。

项目参数是项目中所有包都可以引用的只读变量。项目级连接管理器的一个示例是文件路径。至少在我的世界中,我将其定义为 C:\ssisdata\MyProject 之类的路径,然后我将 Input/Output/Archive 文件夹挂在该路径之外。当我进入生产环境或其他开发人员的机器时,也许该值变为 D:\data 或 \server2\share\MyProject

如果每个包都定义了 FilePath 的参数,那么我将不得不在 运行 时修改每个包的参数以反映服务器环境的值。如果我更改项目中的值,所有包都会采用该新值。

这只是在 Visual Studio 的执行环境中。

运行 来自 SSISDB 的包

当您部署到 SQL 服务器的 SSISDB 目录时,您会得到一些不同的选项。

这里可以设想一个你描述的简单案例。 右键单击包并 select 执行。 FilePath 的粗体文本表示我已经为包的 this 运行 更改了它。左侧的图标显示它是项目级别参数(前两个)还是包级别(最后一个)。

在幕后,这会生成以下内容 SQL

DECLARE @execution_id bigint;

EXEC SSISDB.catalog.create_execution
    @package_name = N'Package.dtsx'
,   @execution_id = @execution_id OUTPUT
,   @folder_name = N'So'
,   @project_name = N'SO_66497856'
,   @use32bitruntime = False
,   @reference_id = NULL
,   @runinscaleout = False;

SELECT
    @execution_id;

DECLARE @var0 sql_variant = N'D:\ssisdata\MyProject';

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 20
,   @parameter_name = N'FilePath'
,   @parameter_value = @var0;

DECLARE @var1 smallint = 1;

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 50
,   @parameter_name = N'LOGGING_LEVEL'
,   @parameter_value = @var1;

EXEC SSISDB.catalog.start_execution
    @execution_id;
GO

每次我想 运行 这项工作并使其适用于环境(D: 而不是 C:),我都必须单击省略号,...,并提供一个值。

有人会把它搞砸,所以要么像我一样编写 TSQL 脚本,然后将其放入作业定义中。但是如果我 运行 Package2,我需要做同样的 运行-time level change,set_execution_parameter_value 以确保 package 也使用 D 驱动器。当我到达 Package100 时,我会说一定有更好的方法。

如果我右键单击我的项目,SO_66497865,我有一个选项 Configure...

你可以看到我将值更改为 D 驱动器上完全不同的路径。 SQL 在幕后与 set_object_parameter_value

合作
DECLARE @var sql_variant = N'D:\Set\Configure\Value';

EXEC SSISDB.catalog.set_object_parameter_value
    @object_type = 20
,   @parameter_name = N'FilePath'
,   @object_name = N'SO_66497856'
,   @folder_name = N'So'
,   @project_name = N'SO_66497856'
,   @value_type = V
,   @parameter_value = @var;
GO

现在当我去 运行 同一个包裹时,看看那个

它使用配置的项目参数值,而我不必提供每个 运行 覆盖(无粗体文本)。

为了完整起见,您最后能做的就是创建一个“环境”。环境是一组共享变量值。例如,我的 Oracle 用户名和密码(标记为敏感)可能是环境级别的东西,因为我的 4 个项目中的任何一个都可能希望将该值用于配置目的。环境 SOEnvironment 可用于任何项目。

我要将 MagicNumber 从我的环境连接到我项目的 OtherProjectParameter。

再次右键单击项目并选择“配置”。转到引用选项卡(这是一次性的 activity)并单击添加,然后找到环境。

现在,返回“参数”选项卡并单击 OtherProjectParameters 上的省略号。请注意,使用环境变量现在不再显示为灰色。这会根据数据类型向您显示允许的环境变量。选择 MagicNumber

单击“确定”后,配置屏幕上现在有一个下划线

此时,当我去运行包裹时,它会显示这样的东西

选择您的环境,这将获取要填写的 OtherProjectParameter

这是关于您的选择的旋风之旅,what/when它们很重要。您应该如何配置事物在很大程度上取决于您的参数化需求。

如果您启用了多个配置,那么当您执行包时——无论是一次性执行还是 SQL 代理作业,您都必须选择环境。在这里,我有 SOEnvironment、SO_67402693_env0 和 SO_67402693_env1 作为我的包和您删除的问题的来源,后两个环境都为配置 OtherProjectParameter[=32 的参数 p 提供了一个值=]

当我去执行包时,它会标记在选择环境之前它无法启动。在这里,我 select env0 会生成以下 tsql。 @reference_id = 20002 是确定优先级的方式,事实上,没有优先级,因为在 运行 时只允许一个环境引用。

DECLARE @execution_id bigint;

EXEC SSISDB.catalog.create_execution
    @package_name = N'Package.dtsx'
,   @execution_id = @execution_id OUTPUT
,   @folder_name = N'So'
,   @project_name = N'SO_66497856'
,   @use32bitruntime = False
,   @reference_id = 20002
,   @runinscaleout = False;

SELECT
    @execution_id;

DECLARE @var0 smallint = 1;

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 50
,   @parameter_name = N'LOGGING_LEVEL'
,   @parameter_value = @var0;

EXEC SSISDB.catalog.start_execution
    @execution_id;
GO

如果通过 SQL 代理而不是右键单击包来执行,则会生成类似的命令,但允许的相同单一环境引用将适用。

当我无论如何都可以通过弹出窗口配置连接管理器时,在 ssis 中参数化连接管理器的确切目的是什么?

向后兼容。 2005/2008 的模式是让 SSIS 连接字符串带有由变量驱动的表达式,然后由经典配置驱动,或者只使用配置直接将值注入 ConnnectionString 属性。有些人继续使用这种方法,就像使用项目部署模型一样。其他人使用 Package/Project 管理器来传递凭据或连接字符串。我赞成使用弹出窗口 window 来处理连接管理器的配置,因为它是一个不太需要处理的移动部分。

project/package 参数的参数是 ftp 凭据。如果预期的文件不存在,现有的 FTP 任务(我最后一次使用它)将会失败。我的模式是编写一个 .NET 脚本来处理 FTP 活动,因为我可以更好地处理丢失文件的情况。但是,我需要将凭证数据安全地传递到我的包中,因此,我需要包参数并且我会选中“敏感”框。如果我在 运行 时间提供它们,那么它们将以明文形式保存在 SQL 代理作业步骤中。