跨项目执行已部署SSIS包遇版本不支持错误及双跳认证问题咨询
我来针对你的问题一步步给出实用的解决方案和分析:
问题1:错误是否由版本差异引发?
你遇到的The attempted operation is not supported with this database version错误,大概率不是SQL Server 2017实例本身的版本问题——毕竟你是执行同一实例上已部署的SSIS包,SSISDB的版本和实例版本是匹配的。
更可能的触发原因是:
- 你采用的执行方式和SSIS目录的部署模型不兼容,比如误用了旧版
dtexec.exe的参数格式来调用SSISDB中的包 - 执行上下文的版本不匹配,比如用SQL Server 2019及以上版本的SSDT工具去操作2017实例的SSISDB,偶尔会出现兼容性提示
问题2:跨项目执行已部署SSIS包的可行方案
下面是几种适合你场景的方案,同时解决双跳认证的问题:
方案1:使用SSIS目录内置存储过程(推荐,同步执行支持)
SSISDB提供了官方的存储过程来执行包,既能实现同步等待,也能解决双跳问题:
基础执行脚本
DECLARE @execution_id BIGINT; -- 创建执行实例 EXEC [SSISDB].[catalog].[create_execution] @package_name = N'你的目标包名称.dtsx', @project_name = N'目标项目名称', @folder_name = N'目标文件夹名称', @use32bitruntime = 0, -- 0=64位,1=32位 @execution_id = @execution_id OUTPUT; -- 可选:设置包参数(如果需要) -- EXEC [SSISDB].[catalog].[set_execution_parameter_value] -- @execution_id, -- @object_type = 30, -- 30代表包参数 -- @parameter_name = N'你的参数名', -- @parameter_value = N'参数值'; -- 启动执行并等待完成(默认同步阻塞,直到包执行结束) EXEC [SSISDB].[catalog].[start_execution] @execution_id;
解决双跳认证问题
- Kerberos委派配置:确保SQL Server服务账号在Active Directory中拥有委派权限,允许它将你的Windows凭据传递到包访问的下游资源(比如其他数据库、文件共享)
- 使用代理账号执行:如果无法配置委派,可以指定有足够权限的账号来运行包:
EXEC [SSISDB].[catalog].[create_execution] @package_name = N'你的目标包名称.dtsx', @project_name = N'目标项目名称', @folder_name = N'目标文件夹名称', @use32bitruntime = 0, @runas_user = N'域\有权限的服务账号', -- 提前在SSIS目录中注册该账号 @execution_id = @execution_id OUTPUT; - 检查认证方式:执行
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID,确保当前是KERBEROS认证,NTLM会导致双跳失败。
方案2:SQL Server代理作业+同步等待
如果你更倾向用作业管理,也可以实现同步等待包执行完成:
- 创建一个SQL Server代理作业,作业步骤选择“SQL Server Integration Services包”,指向SSISDB中的目标包
- 用T-SQL启动作业并循环等待完成:
DECLARE @job_name NVARCHAR(128) = N'你的SSIS包作业名称'; DECLARE @job_id UNIQUEIDENTIFIER; SELECT @job_id = job_id FROM msdb.dbo.sysjobs WHERE name = @job_name; -- 启动作业 EXEC msdb.dbo.sp_start_job @job_name = @job_name; -- 循环等待作业结束 WHILE 1 = 1 BEGIN DECLARE @job_status INT; SELECT @job_status = current_execution_status FROM msdb.dbo.sysjobactivity WHERE job_id = @job_id AND session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC); -- 状态说明:3=成功,4=失败,6=停止,其他为运行中 IF @job_status IN (3,4,6) BREAK; WAITFOR DELAY '00:00:10'; -- 每10秒检查一次 END -- 根据状态抛出提示或错误 IF @job_status = 3 PRINT '包执行成功' ELSE RAISERROR('包执行失败,状态码:%d', 16, 1, @job_status);
双跳解决
给代理作业的执行账号配置足够的权限,或者在AD中给该账号配置委派权限。
方案3:PowerShell/程序调用SSIS API
如果是在脚本或应用程序中执行,可以用SSIS的管理模块:
PowerShell示例(需安装SqlServer模块)
$instanceName = "你的SQL实例名" $folderName = "目标文件夹" $projectName = "目标项目" $packageName = "目标包.dtsx" # 连接到SSIS目录 $ssisConn = Connect-SqlServer -ServerInstance $instanceName -Database SSISDB # 启动包执行并等待完成 $execution = Start-ISExecution -Catalog $ssisConn -FolderName $folderName -ProjectName $projectName -PackageName $packageName -Wait # 检查执行结果 if ($execution.Status -eq "Succeeded") { Write-Host "包执行成功" } else { throw "包执行失败,状态:$($execution.Status)" }
双跳解决
在PowerShell中使用Invoke-Command配合Kerberos委派,或者用RunAs命令切换到有权限的账号执行脚本。
内容的提问来源于stack exchange,提问作者Guy Gross




