データベース履歴表/追跡表


13

現在、次のように追跡/履歴テーブルを構造化します。

  • PrimaryKey-ID
  • OtherTableId-fk
  • fieldName-追跡するフィールドの名前
  • OldValue
  • NewValue
  • ユーザー名
  • CreateDateTime

したがって、基本的には、別のテーブル履歴を追跡し、変更されたフィールドの列名を新しい値と古い値で保存するテーブルが必要です。私の質問は、誰でもこれに穴を開けることができますか?また、その追跡がテーブルの列名のみがfieldName列に入力されるようにする最も簡単な方法は何ですか?現在、私のオプションは、作成中のサービスに列挙を含めるか、別のステータステーブルを作成してfieldNameをfkにすることです。より良いアイデアはありますか?

目標の編集:現在、追跡する必要があるフィールドは2つだけです。1つのフィールドはWebページに表示され、履歴が表示されます。もう1つのフィールドには1つの部門のみがアクセスし、クエリ可能なデータベースのビューにアクセスできます。彼らは、この1つのフィールドだけを照会して、フィールドを変更したユーザーと何に関する情報を取得します。これが、テーブルレコード履歴の正確なコピーではなく、データベースフィールドがテーブル列を定義する場所に設定したかった理由です。将来的にフィールドを追加または削除する可能性がある2つのフィールドのみを追跡する必要があります。

ありがとう!


追跡するテーブルの数を事前に知っていますか?
コフィサルフォ

このテーブルは、他の1つのテーブルのみを追跡します。これまでのところ、この1つのテーブルのみを追跡しています。
user76982

したがって、このアプローチはやり過ぎかもしれません。さらに悪いことに、スナップショットを再作成する必要がある場合、ある時点でライブデータを再作成するために一緒に監視されているテーブルでこのテーブルをクエリすることは簡単ではありません。
コフィサルフォ

1
反対に、最も頻繁に変更される列を確認するクエリは、提案したアプローチを使用すると簡単になります。
コフィサルフォ

dba.stackexchange.comで検索できます。そこには同様の質問が出されており、使用できる答えがあるかもしれません。
FrustratedWithFormsDesigner

回答:


8

穴を突く:データベーススキーマが同じ時点で後で変更され、列名が変更された場合、または列が完全に削除された場合はどうなりますか?多くのデータベースシステムでこれが可能です。その場合、「fieldName」はどうなりますか?

データの整合性のために、すべての更新または削除操作が追跡テーブルを確実に更新するようにする必要があります。これは、ストアドプロシージャを呼び出すトリガーによって最もよく達成されます。これらのストアドプロシージャのみが追跡テーブルへの書き込みアクセス権を持っていることを確認してください。そうすれば、他の誰も間違った値を書き込むことができません。

データベースベンダー固有のソリューションを使用できる場合:ほとんどのデータベースシステムには、スキーマ情報(テーブル名、テーブルID、列名など)が保存されるシステムテーブルがあります。このようなシステムテーブルへの外部キー参照を設定できるかどうかを確認できます。データベースがこのようなものをサポートしている場合、フィールド名をフィールドIDで置き換えることができます。

実際、すべての列(列の小さなサブセットだけでなく)を含む特定のテーブルの行全体を追跡する必要がある場合は、@ sarfeastの提案を検討する必要があります。名前と値のペアモデルの欠点についてこの記事をお読みください。


8

私が見た中で最も成功した変更監査(履歴追跡)実装は、一般的ではなく、はるかに単純です。監視する各テーブルの変更ログテーブルを作成し、同一の列名とデータ型を保持します(タイムスタンプ用の追加列を使用)。

最終目標、つまり監査されたデータをどのように使用したいかが、各アプローチの適切性を評価するのに役立ちます。


こんにちはSarfeast、私は達成したい最終目標を追加しました。そもそもこれが含まれていないことを申し訳ありません。
user76982

このアプローチには欠点があります。こちらをご覧ください:database-programmer.blogspot.co.uk/2008/07/history-tables.html
トゥッカハアパニエミ

7

要するに、値の変更を追跡するテーブルに監査証跡メカニズムを設定する必要があります。

単一の監査証跡表

テーブルを作成して、テーブル名、フィールド名、およびデータの古いバージョンと新しいバージョンを記録します。この方法では、通常、古いバージョンと新しいバージョンの両方のデータと、変更されたフィールドのみをログに記録します。これをトリガーに実装するには、テーブルに主キーがあるか、単一行のみが更新される必要があります。

これを達成する方法についてのスクリプト付きの良い投稿があります- 監査証跡の作成

見るべき他の有用な参照


2番目のリンクは現在不良です。
ジェレミーハリス

@cillosis、これに気づいてくれてありがとう。今すぐ更新されます:)
ユスボフ

3

NHibernate Envers プロジェクトのドキュメントでアイデアを確認してください。

基本的に、タイムスタンプやユーザーなどの追加データを追加できる1つのリビジョンテーブルがあります。次に、追跡する各テーブルは、すべての列が複製された追加の監査テーブル、リビジョンテーブルへのfk、およびリビジョンのタイプ(追加、変更、削除)を取得します。私の知る限り、削除を防ぐため、監査テーブルに実際のテーブルへの実際のFKを持たせたくないでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.