2009-09-17 32 views
6

現在のエンタープライズソリューションは、Entity Frameworkによって駆動されるASP.NET MVCアプリケーションです。監査のために変更イベントにフックする方法については、いくつかのリンクがあります。私は本当にこれに興味がありません。エンタープライズデータ監査

私はエンタープライズレベルの監査アーキテクチャに興味があります。エンタープライズレベルの戦闘傷害を負った皆さん、あなたの監査ソリューションは何ですか?フレームワーク内のデータベース内のオブジェクトをシリアル化しますか?データベースのトリガーを監査テーブルに設定していますか?監査の伸びがアプリケーションデータベースに影響を与えないように、別々のデータベースをまとめて使用しますか?私はここで試された真の解決策に興味があります。私は技術選択(EF)にオプションがあることを知っていますが、私は最初に基礎に興味があります。

リンクは非常に高く評価されます。

+0

私はまた別の重要なメモしておきましょう。我々は、アプリケーションに古いデータが戻ってきているのを見ることに情熱を持っています。これは、シリアライズされたオブジェクトが役立つと感じるところです(デルタを記録するだけでなく)。 – RailRhoad

+2

1つのデータベースと複数のデータベースの区別は、多少人工的です。データベースは複数のファイルグループを持つことができ、テーブルは複数のパーティションを持つことができます。単一のデータベースを多くのデータベースのように効果的に扱うことができ、複数の表であるかのように単一の表を扱うことができます。 –

答えて

1

私はいくつかのソリューションを見てきましたが、私の好きなものはシンプルそのものだった:

  • その監査テーブルを作成します。各ソース表をミラー化し、日付とタイプの変更(サポートしている場合は挿入、更新、または削除)と変更を行うユーザーを追跡するための追加の列を追加します。すべての制約とインデックスを削除します(多くの検索を行うことを期待しない限り)。

  • テーブル更新ロジック(プロシージャを使用しましたが、適切なフックがあれば、OR/Mまたは他のパーシスタンスレイヤでは実行できませんでした)は、ソーステーブルと監査テーブル。

これは、多くの利点を持っていますが、(私の意見では)最大のものは心配やクライアントでのペアの書き込み操作のトランザクションの整合性を管理するためのすべてのコードを記述する必要がされていません。

+0

EFの決定でここにストアされているプロクシはありませんが、変更を加えることができます。だから基本的にこれは、別々のデータベースにアプリテーブルのミラーですか? – RailRhoad

+0

「Employee」と「EmployeeHistory」のようなテーブルが並んでいるように、同じdbを除いて、そうです。 (ただし、上記のCraig Stuntzのコメントはこちらを参照してください)。私はそれがストアドプロシージャを前提としている理由は何もないので、そのテキストを編集しました。 –

+0

これは、1つのデータベースがすべてを2回書き込む必要があることを意味しますか?あなたはこのことからスループットに何らかの影響があることに気付きましたか? – glenatron

2

私はリンクを持っていませんが、システムで私は日の仕事でここに維持の喜びを持っています。基本的に以下の情報を格納する単一の監査テーブルがあります。

テーブル名、PrimaryKeyValue、ModifiedColumn、OldValueプロパティ、NEWVALUE、ChangeUser、さて、これは私たちのコードでは、我々は、自動実装する監査ログのための共通のインタフェースを持って、監査スピードのための素晴らしい作品

変更日付が、から「レビュー」の立場では、情報を取り戻すための「最速の」方法ではありません。 (...私たちは、実際に監査ログを調べる必要がありますには何も行っていない付与)

+0

基本的に1つのテーブルを成長させるので、これは同じDB内にありますか? – RailRhoad

+0

はい、それは正しいです。また、現時点ではテーブルのインデックスもありません。それはいくつかの同じDBにありますが、 "データベース"列を追加して外部に格納されている別のバージョンがあります。 –

+0

リレーションシップの変更はどのように処理しますか? – camainc

2

私たちは最近、私たちの企業でこの同じ問題を解決しなければなりませんでした。私たちは以前のバージョンにも戻すことができなくてはなりませんでした。

sqlのテーブルではなく、ビジネスエンティティの監査が終了しました。基本的にDB内のレコードをシリアル化し、あるバージョンから次のバージョンへの変更を追跡します。このアプローチにより、以前のバージョンをビジネスエンティティに戻してから、同じ保存操作を呼び出して元に戻すことができます。この機能を元に戻すには、ここで解決しなければならないため、アプリケーションの責任がシフトされます。それ以外の場合は、参加しているアプリケーションに関する詳細があまりにも多く知っている必要があります。バージョン、日付、ビューの履歴、および変更を監査するために、レコードを取得する操作が提供されます。それは、異なるアプリケーショングループと異なるエンティティ(DB内のすべてが監査される必要があるわけではありません)のためのオプトインアプローチです。

次に、サービスと通信し、すべてのバージョンを表示できる軽量なWebサイトを構築します。私たちは、バージョンを比較する追加/更新/削除を表示する仕組みを構築しました(本当にクールなUI表現)。サービスは、エンティティのバージョンを表示するためのURLへのリンクを送り返すことができます。これにより、webap + winform/wpf appsがブラウザを起動して、ユーザが変更を見ることができます。

誰もが興味を持っている場合はたぶん私はこれをパッケージ化して提供することができます....

+0

EFオブジェクトを取得してシリアライズして、それらを独自の監査テーブル/データベースに格納していますか?親子関係をどうやって扱いますか? – glenatron