[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-liquibase-chto-takoe-preconditions-predusloviya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},954,"chto-takoe-preconditions-predusloviya",29,"liquibase","Liquibase","💧","Что такое preconditions (предусловия)?","Preconditions — это проверки, которые Liquibase выполняет перед применением changeset (или перед обработкой всего changelog). Если предусловие не выполнено, Liquibase может пропустить changeset, пометить его как выполненный, вызвать ошибку или остановиться.\n\n### Основные предусловия\n\n| Precondition | Описание |\n|---|---|\n| `tableExists` | Проверяет, существует ли таблица |\n| `columnExists` | Проверяет, существует ли столбец |\n| `indexExists` | Проверяет, существует ли индекс |\n| `foreignKeyConstraintExists` | Проверяет, существует ли внешний ключ |\n| `viewExists` | Проверяет, существует ли представление |\n| `sequenceExists` | Проверяет, существует ли последовательность |\n| `dbms` | Проверяет тип СУБД |\n| `runningAs` | Проверяет имя пользователя БД |\n| `sqlCheck` | Выполняет SQL-запрос и сверяет результат |\n| `changeSetExecuted` | Проверяет, был ли выполнен другой changeset |\n\n### Действия при невыполнении предусловия (onFail)\n\n| Значение | Поведение |\n|---|---|\n| `HALT` | Прекратить выполнение (по умолчанию) |\n| `CONTINUE` | Пропустить changeset и продолжить |\n| `MARK_RAN` | Пометить changeset как выполненный и продолжить |\n| `WARN` | Вывести предупреждение и продолжить |\n\n### Пример\n\n```xml\n\u003CchangeSet id=\"6\" author=\"fedorov\">\n    \u003CpreConditions onFail=\"MARK_RAN\">\n        \u003Cnot>\n            \u003CcolumnExists tableName=\"users\" columnName=\"phone\"\u002F>\n        \u003C\u002Fnot>\n    \u003C\u002FpreConditions>\n\n    \u003CaddColumn tableName=\"users\">\n        \u003Ccolumn name=\"phone\" type=\"VARCHAR(20)\"\u002F>\n    \u003C\u002FaddColumn>\n\u003C\u002FchangeSet>\n```\n\nВ данном примере, если столбец `phone` уже существует, changeset будет помечен как выполненный (MARK_RAN) и пропущен. Это удобно при работе с уже существующими БД.\n\n\u003Cdetails>\u003Csummary>Комбинирование предусловий с логическими операторами\u003C\u002Fsummary>\n\n```xml\n\u003CpreConditions onFail=\"HALT\">\n    \u003Cand>\n        \u003Cdbms type=\"postgresql\"\u002F>\n        \u003CtableExists tableName=\"users\"\u002F>\n        \u003Cnot>\n            \u003CcolumnExists tableName=\"users\" columnName=\"middle_name\"\u002F>\n        \u003C\u002Fnot>\n    \u003C\u002Fand>\n\u003C\u002FpreConditions>\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** интервьюер хочет услышать практический кейс использования preconditions — например, безопасное добавление столбца в таблицу, которая может уже содержать его. Важно знать разницу между HALT и MARK_RAN.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое preconditions (предусловия)? — Gymterview","Preconditions — это проверки, которые Liquibase выполняет перед применением changeset (или перед обработкой всего changelog). Если предусловие не выполнено, Liq","Preconditions — это проверки, которые Liquibase выполняет перед применением changeset (или перед обработкой всего change",[7,13],"Preconditions — это проверки, которые Liquibase выполняет перед применением changeset (или перед обработкой всего changelog). Если предусловие не выполнено, Liquibase может пропустить changeset, пометить его как выполненный, вызвать ошибку или остановиться.",true]