web-dev-qa-db-ja.com

監査証跡をキャプチャするためのデータベース設計に関するアイデア

DBにデータのログを保持するにはどうすればよいですか?

各行に加えられたすべての変更のログを保持する必要があります。つまり、DELETEUPDATEの実行を許可できません。

どうすればそのようなログを保持できますか?

42
Greens

「データベースのみを挿入」を使用する

基本的な考え方は、データを更新または削除しないことです。

各テーブルには2つの日時列fromおよびtoがあります。

それらはそれぞれnull値で始まります(時間の始まりから時間の終わりまで)

行を「変更」する必要がある場合は、新しい行を追加すると同時に、前の行のtoをNowに更新し、行のfromを更新します。 Nowに追加しています。

Where = nullが含まれているビューを介してテーブルからデータを読み取ります。

この方法では、いつでもデータベースの状態を把握できます。

[〜#〜]編集[〜#〜]

コメントに応じて明確にするために:シーケンスは、テーブルの主キーによって与えられ、自動インクリメント番号になります。

28
Shiraz Bhaiji

[遅い投稿ですが、ここではまだ言及されていない2つの手法が追加されます]

トランザクションログの読み取り–データベースが完全復旧モードの場合、トランザクションログには、各行の履歴を確認するために使用できる多くの有用な情報が格納されます。欠点は、これがデフォルトでサポートされていないことです。文書化されていない関数DBCC LOG、fn_dblog、または ApexSQL Log などのサードパーティツールを使用してみてください。

チェンジデータキャプチャの使用- チェンジデータキャプチャ は基本的に上記と同じことを行いますが、より合理化され、少し簡単です使用する。残念ながら、これはエンタープライズ版でのみ利用できます。

これらはどちらも、トランザクションログに書き込まれる内容を実際に変更することができないため、更新と削除を許可する問題を解決できます。

17
Herbert Lynch

Shiraz Bhajiの説明に従って「挿入のみ」のデータベースを使用しますが、より簡単な手法を使用できます。監査データを維持する必要がある各テーブルについて、更新された時刻の列を追加します。デフォルトは現在です。レコードを変更するときは、更新するのではなく、すべてのデータを挿入します。 UpdatedTime列は現在の時刻を取得します。

この方法では、UNIQUE制約を解除または再検討する必要があることに注意してください。主キーは保持できますが、一意性は主キーとUpdatedTimeの複合になります。

この手法には、テーブル上の各レコードについて既知の範囲の履歴データの範囲が得られるという利点があります(各レコードは、レコードのトップ1である場合、所定の時間有効ですWHERE TimeOfInterest> UpdatedTime ORDER BY UpdatedTime DESC)。 (表の1列のみ)。また、このメソッドを使用しないテーブルからの変換にも非常に適しています。単一の列(一貫して名前を付けることができます)を追加する単純なALTER TABLEを使用します。次に、現在の制約とUpdatedTime列の複合を使用するようにUNIQUE制約を変更するだけでよく、一部のクエリを変更する必要があります。

また、各レコードの最新のエントリを返すだけのテーブルのビューを作成すると、実際にはすべてのクエリの変換を回避できることに注意してください。履歴データを透過的に保持するテーブルと、変更ログのない通常のテーブルのように見えるビューになります。

14
Paul Sonier

まったく異なるアプローチは、監査ログのみを持つことです。次に、これを使用して、データの最新バージョンを構築します。 「チェックポイント」を定期的に作成するか、キャッシュを使用してこれを高速化します。

このテクニックを使用している誰かについてのプレゼンテーションがあります: http://www.infoq.com/presentations/greg-young-unshackle-qcon08 。ここでの大きな利点は、監査ログしか持っていないため、監査証跡が正しいことを確信できるということです。

私はこれを試したことはなく、かなり複雑に見えますが...

5
Dave

別のデータベースロギングの質問に対する私の回答に、必要な情報が含まれているかどうかを確認してください。ここでそれを見つけてください...

履歴テーブルの長所、短所、および問題点-トリガー、sproc、またはアプリケーションレベルを使用

1
cmdematos.com