You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DbUp执行已有数据库迁移失败:存储过程引用重命名列报错

DbUp脚本执行问题的两种解决方案

方案一:让DbUp仅执行新增的两个脚本

  • 脚本筛选法
    给新增的两个脚本按序号命名(比如003_RENAME_COLUMN.sql、004_ALTER_SP_dbo.TestSP.sql),然后在DbUp配置里指定只运行这两个脚本。示例代码:
    var upgrader = DeployChanges.To
        .SqlDatabase(connectionString)
        .WithScriptsFromFileSystem(@"Scripts", new FileSystemScriptOptions
        {
            Filter = file => file.Name == "003_RENAME_COLUMN.sql" || file.Name == "004_ALTER_SP_dbo.TestSP.sql"
        })
        .LogToConsole()
        .Build();
    
    也可以用序号范围筛选,比如只执行序号大于002的脚本,适合后续新增更多脚本的场景。
  • 临时修改执行记录(谨慎使用)
    直接操作DbUp默认的SchemaVersions表,把002_CREATE_SP_dbo.TestSP.sql的记录标记为已执行。这种方法只适合紧急修复,不推荐长期用,容易破坏脚本执行的完整性。

方案二:修改原有存储过程脚本,仅首次运行时创建

把原来的002_CREATE_SP_dbo.TestSP.sql改成仅当存储过程不存在时才创建的逻辑,这样后续DbUp运行时不会重复执行创建语句,自然不会触发列不存在的错误。修改后的脚本示例:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestSP]') AND type in (N'P', N'PC'))
BEGIN
    EXEC('CREATE PROCEDURE [dbo].[TestSP]
    AS
    BEGIN
        -- 初始版本逻辑,用到ColumnToRename列
        SELECT ColumnToRename FROM TestTable;
    END')
END

之后正常运行DbUp,它会先执行重命名列的脚本,再执行修改存储过程的新脚本,不会再触发原002脚本的错误。

内容的提问来源于stack exchange,提问作者Leemellaret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:25:35