Сделайте что-нибудь, если в DbUp произошел сбой одного скрипта обновления

Учитывая, что DbUp настроен на нашу локальную файловую систему, настроенную следующим образом

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

Есть ли обработчик или механизм для обработки ошибок в файлах скриптов одиночного обновления? Мой текущий сценарий - кто-то написал плохой файл сценария (который позже исправлен в следующем сценарии) и должен быть проигнорирован, если есть ошибка.

Я не могу найти где-нибудь в документах, где я мог бы добавить какую-то логику для (не просто) продолжения при ошибке, но чтобы попытаться добавить некоторые умные подсказки о том, можно ли пропустить сценарий, потому что он был плохо написан (например, создать таблицу без проверки если он уже существует).

1 ответ

В модели DbUp логика, необходимая для адаптации к проблемам при выполнении сценария, должна находиться внутри самого сценария, а не в коде выполнения.

Например, если вы беспокоитесь о том, что скрипт добавления столбца может завершиться сбоем, так как столбец уже существует, вам следует заключить команду в оператор if. То же самое с оператором отбрасывания столбца или другим способом изменения схемы.

Если вы ищете универсальный обработчик отката, его нет. Вы можете посмотреть на выполнение ряда сценариев в транзакции, но у этого есть свои проблемы.

Это может зависеть от обстоятельств, но вы можете написать сценарий "однократного выполнения", который выполняется перед сценариями из файлов. Это выглядело бы примерно так:

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пространство имен. Что довольно просто.

Теперь, используя этот подход, вы можете убедиться, что он выполняется раньше других ваших скриптов, и у вас есть возможность либоRunOnce или RunAlways через конструктор SqlScript объект.

Другие вопросы по тегам