これは監査証跡を作成するための最良のアプローチですか?

StackOverflow https://stackoverflow.com/questions/711597

  •  23-08-2019
  •  | 
  •  

質問

特定のユーザー フォームのデータが時間の経過とともにどのように変更されたのかを監査証跡として記録し、そのページの下部に日付の監査を記録する機能を作成しようとしています。例えば:

02/04/09 21:49 名前が「トム」から「クリス」に変更されました。

これを行うには、データを現在の形式でセッションに保存し、保存時に保存されているデータに違いがあるかどうかを確認します。存在する場合は、最新の編集前のデータを履歴というテーブルに保存し、新しい値を現在のユーザー テーブルに保存します。

これが最善のアプローチでしょうか?

役に立ちましたか?

解決

1つの提案;これは、データベース・トリガーで行うことは比較的容易だろう。その場合は、アップデートを実行しているコードは、履歴レコードを追加するために覚えているかどうかを心配する必要はないだろう。

他のヒント

「最善のアプローチ」が 1 つあるのかどうかはわかりません。開発パスがどの程度進んでいるのかなど、考慮すべき変数は非常に多くあります。

コードベースと DB トリガーの両方の監査ソリューションを経験した私は、以下にいくつかのコメントをリストしました。(開発の観点から) 現在の状況がこれらの問題に影響を与える可能性があることがおわかりいただけたと思います。

  • データを変更したユーザーをマップする必要がある場合 (通常はそうします)、db トリガーは何らかの方法でこの情報を取得する必要があります。不可能ではありませんが、これにはさらなる作業といくつかのアプローチ (クエリを実行する DB ユーザー、各テーブルの共通ユーザー列など) が必要です。
  • DB トリガーを使用しており、クエリから返される影響を受ける行数に依存している場合は、監査トリガーでこれをオフにするか、既存のコードを変更してそれらを考慮する必要があります。
  • 私見では、db トリガーはセキュリティを強化し、監査自動化への簡単なパスを提供しますが、適切なアクセス権を持つユーザーであれば誰でもトリガーを無効にし、データを変更し、再度有効にすることができるため、絶対確実というわけではありません。言い換えれば、データベースのセキュリティアクセス権が厳格であることを確認してください。
  • 履歴用に 1 つのテーブルを用意することは悪い方法ではありませんが、複数のテーブルの履歴を監査する場合、特に監査証跡の再構築に関しては、より多くの作業 (および保存するデータ) が必要になります。1 つの監査テーブルに書き込もうとするテーブルが多数ある場合は、ロックの問題も考慮する必要があります。
  • 各テーブルに監査履歴テーブルを用意することも、別のオプションです。必要なのは、監査テーブルの各列を NULL 可能にし、アクション (挿入/更新/削除) の日時とアクションに関連付けられたユーザーを保存することだけです。
  • 単一テーブル オプションを使用する場合、これに費やす時間があまりない場合を除き、挿入を避けたくなるかもしれませんが、更新または削除のみを監査しようとあまり気を使いすぎないでください (ほとんどのアプリがこれを行うため)更新や削除よりも頻繁に実行されるため)、監査履歴の再構築にはかなりの作業がかかります。
  • サーバーまたはデータが複数のタイムゾーンにまたがる場合は、タイムラインを保存および再構築できるように、適切な日時型の使用を検討してください。監査イベントの日付を UTC で保存し、タイムゾーン オフセットも含めます。
  • これらの監査テーブルは巨大になる可能性があるため、パフォーマンスに影響を及ぼし始めた場合には戦略を立ててください。オプションには、異なるディスクへのテーブルのパーティション化、アーカイブなどが含まれます。基本的にこれについては問題になったときに考えるのではなく、今考えてください:)

私はいつも一つのテーブルを使用して、代わりに「アクティブ」テーブルと「履歴」テーブルにそれを壊すのファンしてきました。作成、削除、起動、終了:私は4つのこれらのテーブル上の列、すべてのタイムスタンプを置きます。 「作成」と「削除」かなり自明です。 「開始」と「終了」のタイムスタンプは、レコードが実際には「アクティブ」記録したときのためのものです。現在アクティブなレコードがnow()する前に、「開始」時間とNULL「終了」時間を持っているでしょう。 「作成」および「開始」時間を分離することで、将来的に場所を取るために変更をスケジュールすることができます。

2テーブルのデザインとは対照的に、

このデザインは、あなたが簡単に自動的に右のデータを操作しますクエリを記述することができます。あなたのテーブルには時間をかけて税率を記憶していると仮定...あなたがのために、古い請求書を処理する際に履歴テーブルにものをルックアップするために決定の余分な複雑さを持っている彼らの計算で税率を使用するすべてのクエリを持っている必要はありませんたとえば...あなただけに関係なく、それは現在の税率だかどうかの、請求書を1つのクエリで作成された時点で有効な税率を調べることができます。

この考え方は私が(私はなかったが、それについて読んでに自分の前にラフなアイデアを再発明)は、もともとはない...あなたはこの中にそれについての詳細な議論<のhref = "HTTPを見つけることができます:// www.cs.arizona.edu/~rts/tdbbook.pdf」のrel = "nofollowをnoreferrer">オンラインブックでます。

セッションの関与が(2人のユーザーが同時に同じデータで作業しているとき、あなたはあなたが?それを適切に処理しているされている)が、一般的に、ええ、履歴テーブルを維持することは権利である私は少し警戒します事ます。

私はまた、別の監査テーブルへのレコードの変更の詳細に挿入または更新(前に、何を、値、後の値)上のデータベース・トリガーについて思うだろう。そのように、あなたは、データを直接データベースを使用してアプリのoutide変更されても、それはまだピックアップされることを知っています。

また、データは、このようなデータを読み取る際に、それをチェックし、レコードのハッシュまたはCRCを計算し、どこかのフィールドに格納するよう、あなたのアプリのoutide変更されたかどうかを検出するために何かをしたい場合があります。

私はあなたの提案があなたがビジネスレベルの監査を取得するように、オブジェクト/レコードの比較を可能にするために、コード/メタデータの多くを書い伴うと思います。

また、データベース・トリガーは、あなたに何が起こったかの十分に高いレベルのビューを提供しない場合があります。あなたがビジネス上の意味を再作成の手間がOKになるように、まれに監査を使用する場合、これは許容可能である。

このはまた、メタデータの多くを必要とせずに、意味のある何かをダンプするオブジェクトモデルにリフレクションを使用することができAOP(アスペクト)のための良いアプリケーション、のように思える。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top