さて、これは書き直しです。私が最初に応答したときに見逃したのは、アプリケーションがその履歴をメインテーブルに保存していることです。これで、@NickCraverがコードについて非常に謝罪している理由がわかりました。
さて、最初にすることは、このデザインの加害者を追い詰めて、彼らが二度とそれをしないことを確認することです。このような履歴の保存は拡張性がなく、通常の(非履歴)クエリをより複雑にし、リレーショナル整合性を妨害します。明らかに、それが問題にならないシナリオがあり、おそらくあなたのサイトもその1つですが、一般的にこれは非常に悪い実装です。
これを行う最良の方法は、 Oracle 11gTotalRecallです。 。これは、完全に目に見えない効率的な実装を備えたエレガントなソリューションであり、オラクルの他の有料エクストラの基準によれば、かなりリーズナブルな価格です。
ただし、Total Recallが問題外であり、本当にこれを行う必要がある場合は、更新を許可しない 。既存のCONTACTレコードへの変更は、挿入する必要があります。これを機能させるには、INSTEADOFトリガーを使用してビューを作成する必要がある場合があります。それはまだ厄介ですが、あなたが今持っているものほど厄介ではありません。
Oracle 11.2.0.4以降、TotalRecallはFlashbackArchiveのブランド名に変更され、エンタープライズライセンスの一部として含まれています(ただし、Advanced Compressオプションを購入しない限り、圧縮されたジャーナルテーブルは削除されます)。
Oracleのこの大規模な機能により、FDAは履歴を保存する通常の方法になります。効率的でパフォーマンスが高く、履歴クエリをサポートする標準構文を備えたOracleが組み込まれています。悲しいかな、私はまだ何年もの間、パッチコックされたトリガー、壊れた主キー、そして恐ろしいパフォーマンスを備えた半調理済みの実装を見ることを期待しています。ジャーナルは、すべての事業運営の99.99%とはほとんど関係のない低レベルの配管であるにもかかわらず、開発者が喜ぶ気晴らしの1つであるように思われるためです。