辞めた同僚から引き継いだシステムで問い合わせがありました。
「ある番号」を表示する部分が、「20160509001→20160509001」と同じ番号が2回表示されていて、本来は1回だけのはずとのことです。
スクリーンショットも送られてきていたので見てみると、確かに同じ番号が矢印でつないで2回表示されていました。
対象データ確認
調査の手順は、こちらの環境のプログラムと、お客さんの環境で稼働している本番データベースを用いて、現象を確認することから始めます。結果は、送られてきたスクリーンショットと全く現象を確認できました。
現象を確認すると、対象のデータのidが分かる仕組みになっています。
次は、Oracle SQL Developerを使ってデータベースに登録されている内容を確認します。
製品情報 - Oracle SQL Developer
対象のデータのidを使って絞り込み、データを確認すると、親データのidを格納するカラムに、親データのidが入っています。
親データのidと対象のデータのidを使って再度絞り込み、データを確認すると、「ある番号」を格納するカラムにどちらも「20160509001」が入っていました。
このために現象が発生しているようです。
対象ソースコードを把握
Smartyが使われているソースコードなので、テンプレートから順番にたどって、どこで表示するためのデータを生成しているか確認しました。データを生成するロジックは、データを確認したときと同じように、まず対象のデータのidを使ってデータを取得し、親データのidが入っていたら再帰して、親データも取得するようになっていました。
「ある番号」は、NULLや空文字列でなければ表示するためのデータとして利用するようになっています。
同じように親データのある他のデータを確認すると、親データの「ある番号」を格納するカラムはNULLになっていて、全てのデータで現象が起きているわけではないことは把握できました。
原因は親データの「ある番号」を格納するカラムに、対象のデータと同じ値が入っているからだとわかりました。
対処として、親データの「ある番号」を格納するカラムをNULLにしてしまえば現象は発生しなくなりますが、どうしてこんなことが起きるのか疑問が残ります。
テスト環境で現象を再現させる
データを表示するページには、データを修正する機能があり、「ある番号」も修正することが可能です。この機能とデータを登録の順番を試行錯誤することで、同じ「ある番号」が2回表示される現象を再現させました。
再現の手順は、
- 「ある番号」を格納するカラムはNULLのままデータを新規に登録する。
- 「ある番号」を修正機能を使って登録する。
- 2.で登録した「ある番号」を含み、1.のデータを親データとするデータを新規登録する。
でした。
通常1.と3.の処理だけ行われているようです。
1.と3.は別のシステムで作成されたデータをバッチで登録しています。
2.はユーザーが操作する作業で、今回は3.の処理が完了するのが待てなかったのかもしれず、データを更新されたようです。
再現手順を問い合わせ元に報告して、調査は完了しました。