sql >> データベース >  >> RDS >> Oracle

Oracle-更新時に履歴行を作成するためのトリガー

    さて、これは書き直しです。私が最初に応答したときに見逃したのは、アプリケーションがその履歴をメインテーブルに保存していることです。これで、@NickCraverがコードについて非常に謝罪している理由がわかりました。

    さて、最初にすることは、このデザインの加害者を追い詰めて、彼らが二度とそれをしないことを確認することです。このような履歴の保存は拡張性がなく、通常の(非履歴)クエリをより複雑にし、リレーショナル整合性を妨害します。明らかに、それが問題にならないシナリオがあり、おそらくあなたのサイトもその1つですが、一般的にこれは非常に悪い実装です。

    これを行う最良の方法は、 Oracle 11gTotalRecallです。 。これは、完全に目に見えない効率的な実装を備えたエレガントなソリューションであり、オラクルの他の有料エクストラの基準によれば、かなりリーズナブルな価格です。

    ただし、Total Recallが問題外であり、本当にこれを行う必要がある場合は、更新を許可しない 。既存のCONTACTレコードへの変更は、挿入する必要があります。これを機能させるには、INSTEADOFトリガーを使用してビューを作成する必要がある場合があります。それはまだ厄介ですが、あなたが今持っているものほど厄介ではありません。

    Oracle 11.2.0.4以降、TotalRecallはFlashbackArchiveのブランド名に変更され、エンタープライズライセンスの一部として含まれています(ただし、Advanced Compressオプションを購入しない限り、圧縮されたジャーナルテーブルは削除されます)。

    Oracleのこの大規模な機能により、FDAは履歴を保存する通常の方法になります。効率的でパフォーマンスが高く、履歴クエリをサポートする標準構文を備えたOracleが組み込まれています。悲しいかな、私はまだ何年もの間、パッチコックされたトリガー、壊れた主キー、そして恐ろしいパフォーマンスを備えた半調理済みの実装を見ることを期待しています。ジャーナルは、すべての事業運営の99.99%とはほとんど関係のない低レベルの配管であるにもかかわらず、開発者が喜ぶ気晴らしの1つであるように思われるためです。



    1. MySQLを使用した既存のデータベースの接続

    2. 2つのタイムスタンプで作業するスケジュールとの時間差を計算する方法は?

    3. データベース駆動型のパーマリンクを作成するにはどうすればよいですか?

    4. パフォーマンスの驚きと仮定:STRING_SPLIT()