使用 SQL 身份验证执行 SSIS 包

Executing SSIS Package with SQL Authentication

我有一个通过 HTTP 与远程服务器通信的 SSIS 包。我使用我的数据库 (SQL Server 2012) 中的存储过程执行 SSIS 包,这是从 Web 服务器调用的。 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

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

我的问题是:

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

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

The operation cannot be started by an account that uses SQL Server Authentication. Start the operation with an account that uses Windows Authentication

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

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

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

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

例如:server\winuser Windows 身份验证为 sysadmin,SQL 身份验证登录 sqlauthuser 作为 系统管理员 也是。

sqlauthuser 启用 "Inpersonate Any Login"。以 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