我试图让登录通过内置的 SSISDB 存储过程而不是通过 SQL 代理来启动 SSIS 包。
登录将通过 Ubuntu 机器上的 Airflow DAG 进行连接,因此我们使用 FreeTDS / pyodbc 允许它作为 Windows 登录进行身份验证,这工作正常。
但是,启动包时会发生以下情况:
- 使用
[SSISDB].[catalog].[start_execution] @execution_id
. 尝试同步和异步运行。 - 生成一个执行 ID,以及
[SSISDB].[catalog].[executions]
一个状态为 5(“待定”)的条目 - 约 1 分钟后,执行“完成”并且执行 ID 从所有 SSISDB 表中擦除,并且不会显示在任何内置报告中。
即使添加 exec 参数来创建转储文件,在包执行期间也不会创建任何内容。
额外问题:在大约 1 分钟的时间范围内,从 SQL 代理启动的其他通常可以正常工作的包通常会失败并显示以下错误消息:
由于执行超时,操作失败。
笔记:
- SQL Server 安装在 Windows 上,并且是 SQL Server 2016 Ent。
- 从 Windows 框使用我的 Windows 身份验证登录时,此过程可以正常工作。
- DAG 使用的 Windows 帐户是代理服务帐户,因此具有所有必要的权限。
- 挂起执行的两个 SID 字段
[SSISDB].[catalog].[executions]
与 SQL 代理为同一服务帐户处理的其他工作执行的 SID 匹配。 - 我们正在使用 TDS 版本 7.2 和最新的 FreeTDS 版本。
- 使用自动提交 True/False 时没有区别
- 执行期间没有看到阻塞
我猜登录在用于启动外部 SSIS 进程时会被重新验证,但我希望可能有一些方法可以使这项工作仍然有效。
由于增加了复杂性和安全隐患,通过 CLR 调用是不受欢迎的选择。
我目前也在测试通过 dtexec 通过 xp_cmdshell 启动它们(看起来很有希望),但我不清楚它如何/为什么会起作用,而使用存储过程则不会。
SSIS 目录执行模拟连接的登录,因此可能更正它是一个身份验证问题。简单的解决方法是为要运行包的身份配置 SQL代理代理,并配置代理作业以运行包,使用sp_start_job调用该作业。
这与使用 xp_cmdshell 直接运行 dtexec 或从 powershell 调用包执行过程类似,但更安全。在这两种情况下,本地身份都用于执行包。