You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨项目执行已部署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代理作业+同步等待

如果你更倾向用作业管理,也可以实现同步等待包执行完成:

  1. 创建一个SQL Server代理作业,作业步骤选择“SQL Server Integration Services包”,指向SSISDB中的目标包
  2. 用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

火山引擎 最新活动