5 つの異なるテーブルに分割されたエンティティがあります。これらのテーブルのうち 3 つのレコードは必須です。他の 2 つのテーブルのレコードはオプションです (エンティティのサブタイプに基づきます)。
テーブルの 1 つがエンティティ マスターに指定されます。他の 4 つのテーブルのレコードは、マスターからの一意の ID をキーとしています。
更新/削除トリガーが各テーブルに存在し、レコードの変更後、(トリガー内の削除されたテーブルから) 履歴が関連する履歴テーブルに保存されます。各履歴テーブルには、関連するエンティティ フィールドとタイムスタンプが含まれています。
したがって、ライブ レコードは常にライブ テーブルにあり、履歴/変更は履歴テーブルにあります。履歴レコードは、タイムスタンプ列に基づいて並べ替えることができます。明らかに、タイムスタンプ列は履歴テーブル間で関連付けられていません。
さて、より難しい部分です。
- レコードは、最初は 1 つのトランザクションで挿入されます。1 回のトランザクションで 3 つまたは 5 つのレコードが書き込まれます。
- 個々の更新は、5 つのテーブルのいずれかまたはすべてに対して発生する可能性があります。
- すべてのレコードは、単一のトランザクションの一部として更新されます。ここでも、1 回のトランザクションで 3 つまたは 5 つのレコードが更新されます。
- 番号 2 は複数回繰り返すことができます。
- 番号 3 は複数回繰り返すことができます。
アプリケーションは、単一のトランザクションとしてのみ書き込まれたレコードに基づいて、ある時点の履歴エントリのリストを表示することになっています (ポイント 1、3、および 5 のみ)。
現在、タイムスタンプ データのみに基づいて履歴レコードを取得するアルゴリズムに問題があります。
トランザクションに関する追加情報を保持する HISTORYMASTER テーブルを追加すると、問題が部分的に解決されるようです。すべてのトランザクションの前に、新しいレコードが HISTORYMASTER に追加されます。新しい HISTORYMASTER.ID は、トランザクション中に各エンティティ テーブルに保存されます。特定の HISTORYMASTER.ID (タイムスタンプ順) の最初のレコードを選択することで、特定の時点の履歴を取得できます。
複数のテーブルにまたがるエンティティの AFTER (UPDATE, DELETE) TRIGGER に基づいて監査テーブルを管理する最適な方法はありますか?