3

非常に奇妙な状況。現在の本番データベースであるルートchangelog.groovyがあります。また、latest-changelog.groovyもあります。これは、基本的にいくつかのマイナーなdiff修正を加えたdiffです(diffは完全ではないため)。

空のデータベースから開始すると、次のように機能します(シナリオ1)。

  • mysqldump本番データベース
  • 開発データベースへのソース
  • latest-changelog.groovyのインクルードを削除します
  • dbm-changelog-syncを実行します
  • 最新のインクルードを追加-changelog.groovy
  • dbm-updateを実行します

以下は機能しません(シナリオ2)。

  • 開発データベースを削除する
  • 空の開発データベースを作成する
  • dbm-updateを実行します

何が起こるかというと、最初のchangelog.groovyは問題なく実行されます。しかし、latest-changelog.groovyに到達すると、次のように失敗します。

原因:java.sql.SQLException:'./main_dev/#sql-b4_2334'から'./main_dev/book_project_note'への名前変更時にエラーが発生しました(errno: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では失敗するのか疑問に思います。

4

1 に答える 1

1

これが問題の実際の答えであるかどうかはわかりませんが、失敗の原因はわかっています。book_project_noteテーブルには3つのFKがあります。これらのFKは、dropPrimaryKeyの前にドロップする必要があります(duh)。

ただし、それでもシナリオ1でどのように機能するかはわかりませんが、addForeignKeyConstraintのdeferrable属性と関係があると思います。それが実際に何を意味するのかをまだ研究しようとしています。

于 2012-07-09T21:21:24.907 に答える