Является ли каждая команда DDL SQL обратимой? [контроль версий базы данных] - PullRequest
3 голосов
/ 24 сентября 2008

Я хочу настроить механизм отслеживания изменений схемы БД, такой как описанный в этот ответ :

За каждое изменение, которое вы вносите в базу данных, вы пишете новую миграцию. Миграции обычно имеют два метода: метод "вверх", в котором изменения применяются и метод "вниз" в которые изменения отменены. Один команда приводит базу данных до дата, а также может быть использован для база данных для конкретной версии схема.

У меня следующий вопрос: обратима ли каждая команда DDL в методе «вверх»? Другими словами, можем ли мы всегда предоставлять метод «down»? Можете ли вы представить какую-либо команду DDL, которая не может быть "вниз"?

Пожалуйста, не рассматривайте типичную проблему переноса данных, когда во время метода «вверх» мы теряем данные: например, изменяя тип поля с datetime (DateOfBirth) на int (YearOfBirth), мы теряем данные, которые невозможно восстановить.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2008

на сервере sql каждая команда DDL, о которой я знаю, является парой вверх / вниз.

2 голосов
/ 24 сентября 2008

Да, вы идентифицировали случаи, когда вы теряете данные, либо преобразовывая их, либо просто УДАЛЯЙТЕ КОЛОННУ в миграции "вверх".

Другим примером является то, что вы можете удалить объект SEQUENCE, тем самым потеряв его состояние. Миграция «вниз» воссоздает последовательность, но она начинается заново с 1. Это может привести к тому, что последовательность будет генерировать повторяющиеся значения. Не проблема, если вы выполняете миграцию на пустую базу данных и хотите, чтобы последовательность все равно начиналась с 1, но если у вас есть некоторое количество строк данных, вы хотите, чтобы последовательность была сброшена до наибольшего значения используется в настоящее время, что трудно сделать надежно, если только у вас нет эксклюзивной блокировки на этой таблице.

Любой другой DDL, который зависит от состояния данных в базе данных, имеет аналогичные проблемы. Во-первых, это, вероятно, не очень хороший дизайн схемы, я просто пытаюсь придумать случаи, которые соответствуют вашему вопросу.

2 голосов
/ 24 сентября 2008

Кроме потери данных, каждая миграция, которую я когда-либо делал, является обратимой. Тем не менее, Rails предлагает способ пометить миграцию как «разрушительную»:

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

См. Документацию API здесь .

...