Redmineでチケットの親子関係が壊れたときの対処法

Redmineでチケットの親子関係が壊れてしまったときに、修復するための方法を紹介します。
リアルな親子関係が壊れてしまったときの修復方法はどうしたらいいかわかりません。

壊れたときの症状

チケットの親を変更することができない。
親を変更して保存しようとすると、エラー画面が表示されてしまう。

DBデータを調査

まず子チケット(#15597)のDBデータを調べてみました。
issuesテーブルの当該行を見てみると、root_idがおかしい。
このissueの親は#15562なのでparent_idは正しいのですが、root_idに関係のないidがセットされていました。
mysql> select id,parent_id,root_id,lft,rgt from issues where id=15597;
+-------+-----------+---------+------+------+
| id    | parent_id | root_id | lft  | rgt  |
+-------+-----------+---------+------+------+
| 15597 |     15562 |    8808 |  578 |  579 |
+-------+-----------+---------+------+------+
さらに親チケットについても調べてみると、
mysql>  select id,parent_id,root_id,lft,rgt from issues where id=15562;
+-------+-----------+---------+------+------+
| id    | parent_id | root_id | lft  | rgt  |
+-------+-----------+---------+------+------+
| 15562 |     15628 |    8808 |  577 |  608 |
+-------+-----------+---------+------+------+
1 row in set (0.00 sec)
これもroot_idがおかしい。

壊れたデータの修復方法

まず、親子もろとも、いったん親子関係をリセットしてにして全て孤立チケットにします。

ある特定のチケットを孤立させるにはこうします。
これで親離れ(or 子離れ)できますw
update issues set parent_id=null,root_id=id,lft=1,rgt=2 where id = チケットID;
面倒くさいので親子まとめて全部孤立させましょう。
家族のありがたみというのは、一度離れてみないとわからないものです(何が
update issues set parent_id=null,root_id=id,lft=1,rgt=2 where id IN (
15240, /* ← 親 */
15580, /* ← 子その1 */
15575, /* ← 子その2 */
);
その後、子チケットを1個ずつブラウザで開いて、親チケットIDを手で入力していけばOKです。
これで親子がめでたく元のさやにおさまりました。
めでたしめでたし。

参考

カテゴリ: