在DbUp中单个升级脚本失败时执行某些操作

时间:2017-03-22 22:41:07

标签: c# dbup

鉴于我们已将DbUp设置为查看我们的本地文件系统设置如下

DeployChanges.To
    .SqlDatabase(ConnectionString)
    .WithTransactionPerScript()
    .WithScriptsFromFileSystem(ScriptsPath)
    .LogToConsole()
    .Build()
    .PerformUpgrade();

是否有处理程序或机制来处理单个升级脚本文件中的错误?我目前的情况是有人编写了一个糟糕的脚本文件(稍后会在后续脚本中修复),如果出现错误则需要忽略。

我无法在文档中的任何地方找到我可以添加某种逻辑(不仅仅是)继续出错但是尝试添加一些智能来围绕是否可以跳过脚本,因为它编写得很糟糕(例如,创建表而不检查它是否已经存在)。

2 个答案:

答案 0 :(得分:1)

在DbUp模型中,调整脚本执行中的问题所需的逻辑应该驻留在脚本本身内,而不是驻留在执行代码中。

例如,如果您担心添加列脚本可能因列已存在而失败,则应将该命令包装在if语句中。同上一个drop column语句或其他模式修改内容。

如果您正在寻找一个通用的回滚处理程序,那么就没有。您可以查看在事务中执行一系列脚本,但这有其自身的问题。

答案 1 :(得分:0)

这可能取决于情况,但是您可以编写一个“运行一次”脚本,该脚本在来自文件的脚本之前发生。看起来像这样:

DeployChanges.To
    .SqlDatabase(ConnectionString)
    .WithTransactionPerScript()
    .WithScripts(scriptsHere) // there are a number of ways to provide custom code scripts
    .WithScriptsFromFileSystem(ScriptsPath)
    .LogToConsole()
    .Build()
    .PerformUpgrade();

我喜欢实现一个在IScriptProvider命名空间中扩展DbUp.Engine的类。这很简单。

现在,使用这种方法,您可以确保它可以在其他脚本之前运行,您可以通过a的构造函数RunOnceRunAlways SqlScript个对象。