首页 > 解决方案 > 在 ssis 中参数化连接管理器的目的是什么?

问题描述

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

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

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

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

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

标签: ssis

解决方案


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

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

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

如果每个包都定义了 Parameter FilePath,那么我必须在每个包运行时修改它的参数以反映服务器环境的值。如果我更改项目中的值,所有的包都会获取该新值。

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

从 SSISDB 运行包

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

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

在此处输入图像描述

在幕后,这会生成以下 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,我需要做同样的运行时级别更改,set_execution_parameter_value以确保该包也使用 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。

在此处输入图像描述

再次,右键单击一个项目并选择配置。转到 References 选项卡(这是一次性活动)并单击 Add,然后找到 Environment。

在此处输入图像描述

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

在此处输入图像描述

当您单击确定时,您现在在配置屏幕上有一个下划线

在此处输入图像描述

此时,当我去运行包时,它会显示类似这样的内容

在此处输入图像描述

选择您的环境,这将让 OtherProjectParameter 填写

在此处输入图像描述

这是一个关于您的选择是什么以及什么/什么时候重要的旋风之旅。您应该如何配置事物在很大程度上取决于您的参数化需求。

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

在此处输入图像描述

当我去执行包时,它会标记它在选择环境之前无法启动。在这里,我选择 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 连接字符串具有由变量驱动的表达式,然后由经典 Configuration 驱动,或者仅使用 Configuration 将值直接注入 ConnnectionString 属性。有些人继续使用这种方法,就像项目部署模型一样。其他人使用包/项目管理器来传递凭据或连接字符串。我喜欢使用弹出窗口来处理连接管理器的配置,因为它是一个不太需要处理的部分。

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


推荐阅读