[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-liquibase-chto-delat-esli-changeset-uzhe-primenyon-no-v-nyom-obnaruzhena-oshibka":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},1183,"chto-delat-esli-changeset-uzhe-primenyon-no-v-nyom-obnaruzhena-oshibka",29,"liquibase","Liquibase","💧","Что делать, если changeset уже применён, но в нём обнаружена ошибка?","Правильный подход зависит от того, на каком окружении changeset уже применён. Главное правило: на production никогда не изменять уже применённые changeset-ы.\n\n### 1. Создать новый changeset с исправлением (рекомендуемый подход)\n\n```xml\n\u003C!-- Исходный changeset (уже применён, не трогаем!) -->\n\u003CchangeSet id=\"20\" author=\"dev\">\n    \u003CcreateTable tableName=\"clients\">\n        \u003Ccolumn name=\"id\" type=\"BIGINT\" autoIncrement=\"true\">\n            \u003Cconstraints primaryKey=\"true\"\u002F>\n        \u003C\u002Fcolumn>\n        \u003Ccolumn name=\"name\" type=\"VARCHAR(50)\"\u002F>  \u003C!-- Ошибка: слишком маленький размер -->\n    \u003C\u002FcreateTable>\n\u003C\u002FchangeSet>\n\n\u003C!-- Новый changeset с исправлением -->\n\u003CchangeSet id=\"21\" author=\"dev\">\n    \u003CmodifyDataType tableName=\"clients\" columnName=\"name\" newDataType=\"VARCHAR(255)\"\u002F>\n\u003C\u002FchangeSet>\n```\n\n### 2. Откатить и применить заново (только dev\u002Ftest)\n\n```bash\nliquibase rollbackCount 1\n```\n\nЗатем исправить changeset и выполнить `update`. Этот подход допустим **только** на dev\u002Ftest окружениях, где changeset ещё не был применён на production.\n\n### 3. Использовать runOnChange=\"true\" (для процедур и представлений)\n\n```xml\n\u003CchangeSet id=\"create-view-active-clients\" author=\"dev\" runOnChange=\"true\">\n    \u003CcreateView viewName=\"active_clients\">\n        SELECT * FROM clients WHERE status = 'ACTIVE'\n    \u003C\u002FcreateView>\n\u003C\u002FchangeSet>\n```\n\nПри изменении такого changeset Liquibase перевыполнит его вместо ошибки checksum.\n\n### 4. Удалить запись из DATABASECHANGELOG (крайний случай)\n\n```sql\nDELETE FROM DATABASECHANGELOG\nWHERE ID = '20' AND AUTHOR = 'dev' AND FILENAME = 'db\u002Fchangelog\u002Fchanges\u002F020-create-clients.xml';\n```\n\nПосле этого можно исправить changeset и применить его заново. **Этот подход опасен** и допустим только на dev-окружении.\n\n### Общее правило\n\nНикогда не изменять уже применённые changeset-ы на production. Всегда создавать новый changeset с исправлением.\n\n> **На собеседовании:** интервьюер проверяет, понимаете ли вы принцип иммутабельности changeset-ов. Правильный ответ — создать новый changeset. Частая ошибка — предлагать изменить старый changeset и сделать clearCheckSums, что на production приведёт к непредсказуемым последствиям.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Что делать, если changeset уже применён, но в нём обнаружена — Gymterview","Правильный подход зависит от того, на каком окружении changeset уже применён. Главное правило: на production никогда не изменять уже применённые changeset-ы.","Правильный подход зависит от того, на каком окружении changeset уже применён. Главное правило: на production никогда не ",[7,13],true]