DbUp执行已有数据库迁移失败:存储过程引用重命名列报错
DbUp脚本执行问题的两种解决方案
方案一:让DbUp仅执行新增的两个脚本
- 脚本筛选法
给新增的两个脚本按序号命名(比如003_RENAME_COLUMN.sql、004_ALTER_SP_dbo.TestSP.sql),然后在DbUp配置里指定只运行这两个脚本。示例代码:
也可以用序号范围筛选,比如只执行序号大于002的脚本,适合后续新增更多脚本的场景。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(); - 临时修改执行记录(谨慎使用)
直接操作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
相关产品推荐
相关产品推荐

