Сделайте что-нибудь, если в 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
объект.