2007.01.19

順序(Sequence)ではまる

最近、ちょっとはまった寂しい話を書いてみようと思います。
(ただ、あまりにも恥ずかしい失敗なので、書きたくない気もしますが。。)

実は、納品済みのシステムで仕様変更があり、作業前にデータベースのデータを一度きれいにしようと考え、既存のデータベースに、以前バックアップを取っておいたデータをインポートしようと試みました。(ちなみ、データベースはOracleです。)

そこで、既存のテーブルのデータを全て削除して、DMPファイルをインポートしました。
インポートは、特に大きな問題もなく無事完了。。。
しかし、いくつかプログラムを動かしてみると、同時実行性を考慮しチェックしている、排他チェックのエラーが頻発します。。

なぜだ?まだ、何もプログラムを修正していないのに?
元バグ?そんなはずはない。
あれだけテストしたし。。。(と、自分に言い聞かせた)

そして、しばらく考えたあと・・・
思い出したのです。
このシステムでは、あらゆるSEQ項目の採番に順序(Sequence)を利用していたのです。

あ~、なんてくだらないことで悩んでいたんだ。。。
かなり自己嫌悪です。

バックアップしておいたデータに戻ったのは、テーブルの中身だけで、順序(Sequence)は、既存の順序(Sequence)が存在していたため、元には戻らなかったのです。

システムにデータを復元する手順に順序(Sequence)に関する注意書きを自分自身で書いていたはずなのに。。。(さらに自己嫌悪)

順序(Sequence)って便利ですけど、以前の状態にデータを戻すようなケースで、存在を忘れているとかなり残念な思いをすることになります。

順序(Sequence)って、基本的にただ連番で採番をしていくものなので、(※設定によっては初期値や採番時のカウントアップ数も変更できますが。)以前の状態にテーブルの中身だけを戻して、順序(Sequence)がそのままだと、たまに歯抜けになっている番号があったりして、
うまくいったり、失敗したりの繰り返しになるので、一見、再現性の低い謎なバグのように見えることもあります。
さらに最悪なのは、たまたまかなり広い範囲で歯抜けがあり、その範囲内で採番をしている場合ですかね。。。
しばらくすると、エラーが頻発とか。。。

使用した場合は存在を忘れないように!!
そんなちょんぼをするのは私だけか?

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ykato