使用 SQL 身份验证执行 SSIS 包

Posted

技术标签:

【中文标题】使用 SQL 身份验证执行 SSIS 包【英文标题】:Executing SSIS Package with SQL Authentication 【发布时间】:2019-01-14 21:32:21 【问题描述】:

我有一个通过 HTTP 与远程服务器通信的 SSIS 包。我使用从 Web 服务器调用的数据库 (SQL Server 2012) 中的存储过程执行 SSIS 包。 Web 服务器使用 Windows 身份验证连接到数据库。我现在需要从不支持 Windows 身份验证的客户端运行存储过程(以及因此 SSIS 包)。 SSIS 包非常复杂,无法迁移到其他解决方案。

SSIS 包具有传递的复杂变量。运行包的存储过程如下所示:

CREATE PROCEDURE [dbo].[SSISPackage]
    @Parameter1 XML
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @execution_id BIGINT
    EXEC [SSISDB].[catalog].[create_execution] 
      @package_name=N'Package.dtsx',
      @execution_id=@execution_id OUTPUT,
      @folder_name=N'API',
      @project_name=N'APIProject',
      @use32bitruntime=False,
      @reference_id=Null

    EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
      @execution_id,
      @object_type=30,
      @parameter_name=N'Parameter1',
      @parameter_value=@Parameter1

    EXEC [SSISDB].[catalog].[start_execution] @execution_id     
END

根据我一直在阅读的内容,使用 SQL Server 身份验证对用户进行身份验证是不可能运行 SSIS 包的。

我的问题是:

    是否可以以某种方式将 SQL 用户提升为 Windows 身份验证用户,然后执行存储过程。 是否有处理此问题的典型方法(例如 CLR、队列表、命令行调用包)?

【问题讨论】:

【参考方案1】:

这就是我所做的,也许它可以帮助某人。

第一步, 我以 sysadmin 的身份创建了一个 SQL 身份验证登录名,并允许此登录名模拟其他登录名。

然后,在调用 SSIS 包之前,我也模拟了一个 Windows 身份验证登录名 sysadmin。为了作为另一个登录名执行脚本,我使用了TSQL EXECUTE AS。 (查看下面的示例)

例如:server\winuser 使用 Windows 身份验证作为 sysadmin,SQL 身份验证登录 sqlauthuser 也是 sysadmin

sqlauthuser 启用“模拟任何登录”。以sqlauthuser 身份登录(或使用连接字符串进行连接),然后模拟server\winuser 以便能够调用SSIS 包或过程:

EXECUTE AS LOGIN = 'server\winuser';
-- call ssis packages
-- call procedures that uses ssis packages

参考:https://docs.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-ver15

【讨论】:

这也适用于我们。他们的关键是使用“EXECUTE AS LOGIN”而不是“EXECUTE AS USER”,这导致了如下错误:使用 SQL Server 身份验证的帐户无法启动操作。使用使用集成身份验证的帐户启动操作。消息 6522,级别 16,状态 1,过程 internal.start_execution_internal,第 0 行 [批处理开始第 0 行] 执行用户定义的例程或聚合“start_execution_internal”期间发生 .NET Framework 错误:【参考方案2】:

我认为您不能使用 SQL Server 身份验证执行此操作,您将收到以下异常:

使用 SQL Server 身份验证的帐户无法启动该操作。使用使用 Windows 身份验证的帐户启动操作

您可以采取多种解决方法,请查看以下链接:

The operation cannot be started by an account that uses SQL Server Authentication. SSIS Package Issues with module signing and SSIS catalog internal procedures

【讨论】:

我决定创建自己的 CLR 函数来执行 SSIS 包查询。不理想,但代替更好的解决方案,必须这样做。

以上是关于使用 SQL 身份验证执行 SSIS 包的主要内容,如果未能解决你的问题,请参考以下文章

在SSIS包中使用AD服务帐户

以与 SSISDB 不同的用户身份执行 SSIS 包

当我使用发送邮件任务时,SSIS 包显示错误

SSIS 连接管理器不存储 SQL 密码

SQL Server 数据库权限设置

SQL server数据库的权限设置