Сбой миграции базы данных при попытке удалить первичные ключи, но только иногда

Очень странная ситуация. У меня есть корневой файл changelog.groovy, который является текущей производственной базой данных. У меня также есть файл last-changelog.groovy, который в основном представляет собой diff с некоторыми незначительными исправлениями diff (потому что diff не идеален).

Начиная с пустой базы данных, работает следующее (Сценарий 1):

  • производственная база данных mysqldump
  • источник в базе данных разработчика
  • удалить включение из last-changelog.groovy
  • выполнить dbm-changelog-sync
  • добавить включение last-changelog.groovy
  • выполнить dbm-обновление

Следующее не работает (Сценарий 2):

  • удалить базу данных разработчиков
  • создать пустую базу данных разработчиков
  • выполнить dbm-обновление

Что происходит, так это то, что начальный changelog.groovy работает без сучка и задоринки. Но когда он доходит до last-changelog.groovy, происходит сбой со следующим:

Вызвано: java.sql.SQLException: ошибка при переименовании «./main_dev/#sql-b4_2334» в «./main_dev/book_project_note» (ошибка: 150)

У меня есть таблица, определенная так:

mysql> desc book_project_note;
+---------------------------+------------+------+-----+---------+-------+
| Field                     | Type       | Null | Key | Default | Extra |
+---------------------------+------------+------+-----+---------+-------+
| book_project_id           | bigint(20) | NO   | PRI | NULL    |       |
| note_id                   | bigint(20) | NO   | PRI | NULL    |       |
| book_project_note_type_id | bigint(20) | NO   | PRI | NULL    |       |
+---------------------------+------------+------+-----+---------+-------+

Следующий набор изменений не работает:

changeSet(author: "gdboling (generated)", id: "1341248060406-80") {
  dropPrimaryKey(tableName: "book_project_note")
}

Здесь я пытаюсь удалить первичные ключи, а затем воссоздать 2 из них со следующим:

changeSet(author: "gdboling (generated)", id: "1341248060406-72") {
  addPrimaryKey(columnNames: "book_project_id, note_id", constraintName: "book_project_PK", tableName: "book_project_note")
}

Мне интересно, почему это работает в сценарии 1, но не работает в сценарии 2.


person Gregg    schedule 09.07.2012    source источник


Ответы (1)


Не уверен, что это фактический ответ на проблему, но я понял, что вызывает сбой. В таблице book_project_note есть 3 FK. Эти FK должны быть удалены до dropPrimaryKey (да).

Тем не менее, это все еще не говорит мне, как это может работать в сценарии 1, но я думаю, что это может иметь какое-то отношение к атрибуту deferrable в addForeignKeyConstraint. Все еще пытаюсь исследовать, что это на самом деле означает.

person Gregg    schedule 09.07.2012
comment
Вы можете попробовать запустить dbm-update-sql, чтобы увидеть сгенерированный SQL; там должно быть что-то полезное. - person Burt Beckwith; 10.07.2012