2009-04-11 6 views
0

変更を監査表に格納するためにトリガーを使用していますが、変更された列の値のみを格納します。変更された列の値を監査表にのみ挿入するトリガーの取得

BEGIN 
IF NEW.history_of_repair_trigger_fired = 1 THEN 
INSERT INTO history_of_repair SET 
edit_date_time=NEW.last_edited_date_time, 
edited_by=NEW.edited_by, 
repair_id=NEW.repair_id, 
tenant_name=NEW.tenant_name, 
property_id=NEW.property_id, 
priority=NEW.priority, 
comments=NEW.comments, 
signed_off=NEW.signed_off; 
END IF; 
END 

現時点では、変更されていない値も監査テーブルに格納されていますが、これは望ましくありません。

変更された列のみを監査テーブルに保存するにはどうすればよいですか?

+0

なぜすべての値を格納するのが望ましくないのか説明できますか?一般に、監査テーブルはテーブルの値の履歴として表示され、その時点のすべての値を変更の時刻とともに保存し、誰がそれを実行したかったかを知りたいと考えています。 – tvanfosson

+0

本当に2つの理由 - 1)常にすべてを保存することが効率的であるとは確信できませんでしたか?そして、2)私は監査を使用して、変更された値、すなわち "氏名"が "bill"から "William" 11/04/09 15:47に変更されたことをユーザー:Chris Wattsが現在のレコードの下に表示することのみを意図しています。 – cw84

答えて

1

あなたのコメントに基づいて、私は変更された値だけを保存することは心配しません - ディスクスペースは安いです。実際の値を保存すると、急いで行う必要がある場合は、ある時点にレコードを復元するのが簡単になるという利点があります。人間が判読可能な監査レコードを作成する必要がある場合は、varchar/nvarcharに格納し、その変更を文字列に蓄積してトリガーにメッセージを作成します。私は実際の値に加えてこれを保存するかもしれません。この人間が読める列を格納するのではなく、動的に構築するテーブル値関数を提供することもできます。