DB 内のデータのログを維持するにはどうすればよいですか?
各行に加えられたすべての変更のログを維持する必要があります。それは私が許すことができず、DELETE
実行UPDATE
されることを意味します。
どうすればそのようなログを保持できますか?
DB 内のデータのログを維持するにはどうすればよいですか?
各行に加えられたすべての変更のログを維持する必要があります。それは私が許すことができず、DELETE
実行UPDATE
されることを意味します。
どうすればそのようなログを保持できますか?
「データベースのみを挿入」を使用する
基本的な考え方は、データを更新または削除しないことです。
各テーブルには、fromとtoの2つの日時列があります。
それらはそれぞれの値nullで始まります(時間の始まりから終わりまで)
行を「変更」する必要がある場合は、新しい行を追加すると同時に、前の行のtoをNowに更新し、追加する行のfromをNowに更新します。
where to=nullを含むビューを介してテーブルからデータを読み取ります。
このメソッドは、任意の時点でのデータベースの状態の画像も提供します。
編集
コメントに応じて明確にするために:シーケンスは、自動インクリメント番号であるテーブルの主キーによって与えられます。
Shiraz Bhaji が説明しているように、「挿入のみ」のデータベースを使用しますが、より単純な手法を使用することもできます。監査データを維持する必要があるテーブルごとに、更新時間の列を追加するだけで、デフォルトは now になります。レコードを変更するときは、更新するのではなく、すべてのデータを挿入するだけです。UpdatedTime 列は現在の時刻を取得します。
この方法は、UNIQUE 制約を破棄または再検討する必要があることを意味することに注意してください。主キーを保持できますが、一意性は主キーと UpdatedTime の合成になります。
この手法には、テーブルの各レコードの既知の範囲の履歴データが提供されるという利点があります (各レコードは、レコードの TOP 1 である場合、特定の時間有効です WHERE TimeOfInterest > UpdatedTime ORDER BY UpdatedTime DESC)。 (テーブルの 1 つの列のみ)。また、この方法を使用しないテーブルからの変換にも非常に適しています。単純な ALTER TABLE を使用して単一の列を追加します (一貫して名前を付けることができます)。次に、現在の制約と UpdatedTime 列の複合を使用するように UNIQUE 制約を変更するだけでよく、いくつかのクエリを変更する必要があります。
また、各レコードの最新のエントリを単純に返すテーブルのビューを作成すると、すべてのクエリの変換を実際に回避できることにも注意してください。履歴データを透過的に保持するテーブルと、変更ログのない通常のテーブルのように見えるビューになります。
[投稿が遅れましたが、ここではまだ言及されていない 2 つのテクニックが追加されています]
トランザクション ログの読み取り– データベースが完全復旧モードの場合、トランザクション ログには、各行の履歴を表示するために使用できる多くの有用な情報が保存されます。欠点は、これがデフォルトでサポートされていないことです。文書化されていない関数 DBCC LOG または fn_dblog またはApexSQL Logなどのサードパーティ ツールを使用して試すことができます。
変更データ キャプチャの使用-変更データ キャプチャは基本的に上記と同じことを行いますが、より合理化されており、少し使いやすくなっています。残念ながら、これはエンタープライズ エディションでのみ利用できます。
これらは両方とも、トランザクション ログに書き込まれた内容を実際に変更できないため、更新と削除を許可するという問題を解決できます。
まったく異なるアプローチは、監査ログのみを持つことです。次に、これを使用してデータの最新バージョンを作成します。「チェックポイント」を定期的に作成するか、キャッシュを使用してこれを高速化します。
この手法を使用している人についてのプレゼンテーションがあります:http://www.infoq.com/presentations/greg-young-unshackle-qcon08。ここでの大きな利点は、監査ログしかないため、監査証跡が正しいことを確信できることです。
私はこれを試したことがなく、かなり複雑に思えます...しかし、何かを考える必要があります。
別のデータベース ログの質問に対する私の回答に、必要な情報が含まれているかどうかを確認してください。ここで見つけてください...