DB2 の多数のテーブルでフィールドの変更を追跡するための履歴テーブルを作成したいと考えています。
履歴は通常、テーブルの構造全体をコピーして接尾辞付きの名前を付けることで行われることを知っています (例: user --> user_history)。次に、非常に単純なトリガーを使用して、UPDATE で古いレコードを履歴テーブルにコピーできます。
ただし、私のアプリケーションでは、これはあまりにも多くのスペースを使用します。フィールドが変更されるたびに、レコード全体を別のテーブルにコピーするのは (少なくとも私には) 良い考えとは思えません。したがって、個々のフィールドの変更を追跡する一般的な「履歴」テーブルを作成できると考えました。
CREATE TABLE history
(
history_id LONG GENERATED ALWAYS AS IDENTITY,
record_id INTEGER NOT NULL,
table_name VARCHAR(32) NOT NULL,
field_name VARCHAR(64) NOT NULL,
field_value VARCHAR(1024),
change_time TIMESTAMP,
PRIMARY KEY (history_id)
);
追跡したいすべてのテーブルには、自動生成された単一の id フィールドが主キーとしてあり、これは「record_id」フィールドに入れられます。また、テーブル内の VARCHAR の最大サイズは 1024 です。明らかに、VARCHAR 以外のフィールドが変更された場合は、レコードを履歴テーブルに挿入する前に VARCHAR に変換する必要があります。
さて、これは物事を行うための完全に遅れた方法かもしれません (ねえ、もしそうなら理由を教えてください)。時間の長さ。
とにかく、更新時に履歴テーブルにレコードを追加するトリガーを作成するのに助けが必要です。たとえば、架空のユーザー テーブルを考えてみましょう。
CREATE TABLE user
(
user_id INTEGER GENERATED ALWAYS AS IDENTITY,
username VARCHAR(32) NOT NULL,
first_name VARCHAR(64) NOT NULL,
last_name VARCHAR(64) NOT NULL,
email_address VARCHAR(256) NOT NULL
PRIMARY KEY(user_id)
);
それで、変更を履歴テーブルに挿入するために、ユーザーテーブルの更新時にトリガーを手伝ってくれる人はいますか? 私の推測では、手続き型 SQL を使用して古いレコードのフィールドをループし、それらを新しいレコードのフィールドと比較し、一致しない場合は履歴テーブルに新しいエントリを追加する必要があると思います。
可能であれば、フィールドに関係なく、すべてのテーブルに同じトリガー アクション SQL を使用することをお勧めします。
ありがとう!