質問
現在のエンタープライズソリューションは、Entity Frameworkによって駆動されるASP.NET MVCアプリケーションです。監査のために変更イベントにフックする方法に関するリンクがいくつかあります。私はこれにはあまり興味がありません。
エンタープライズレベルの監査アーキテクチャに興味があります。エンタープライズレベルの戦いの傷をお持ちの方、監査ソリューションは何ですか?フレームワークでデータベース内のオブジェクトをシリアル化しますか。テーブルを監査するデータベーストリガーを設定していますか?監査の増加がアプリデータベースに影響しないように、個別のデータベースをすべて一緒に使用しますか?ここで実証済みのソリューションに興味があります。私たちの技術選択(EF)にはオプションがあることは知っていますが、まず基礎に興味があります。
リンクをいただければ幸いです。
解決
いくつかのソリューションを見てきましたが、私のお気に入りはシンプルさそのものです:
-
各ソーステーブルをミラーリングする監査テーブルを作成し、いくつかの列を追加して、日付と変更の種類(サポートしている場合は挿入、更新、削除)および変更を行うユーザーを追跡します。すべての制約とインデックスを削除します(多くの検索を実行する予定がない場合)。
-
テーブル更新ロジックの内部(手順を使用しましたが、適切なフックがあれば、OR / Mまたはその他の永続化レイヤーでは実行できなかった理由はありません)、ソーステーブルと監査テーブル。
これには多くの利点がありますが、最大の利点(私の意見では)は、クライアントでのペアの書き込み操作のトランザクションの整合性を管理するためにすべてのコードを心配したり記述したりする必要はありません。
他のヒント
リンクはありませんが、システムでは、ここで日常業務を維持する喜びがあります。基本的に次の情報を格納する単一の監査テーブルがあります。
TableName、PrimaryKeyValue、ModifiedColumn、OldValue、NewValue、ChangeUser、Change Date
現在、これは監査速度に最適です。コードでは、監査ログを自動実装するための共通インターフェースがありますが、「レビュー」観点、それは「最速」ではありません;情報を取り戻す方法。 (監査ログを見るために実際に何もしていませんが...)
私たちは最近、企業でこの同じ問題を解決する必要がありました。以前のバージョンにも戻すことができなければなりませんでした。
SQLのテーブルではなく、ビジネスエンティティを監査しました。基本的にDB内のレコードをシリアル化し、あるバージョンから次のバージョンへの変更を追跡します。このアプローチにより、以前のバージョンをビジネスエンティティに取得し、同じ保存操作を呼び出して元に戻すことができます。元に戻すこの機能は、ここで解決する必要があるため、アプリケーションの責任にシフトされます。そうしないと、参加しているアプリケーションに関する詳細が多すぎます。バージョン、日付、履歴の表示、およびもちろん変更を監査するためのレコードを取得するためのサービス操作が提供されています。さまざまなアプリケーショングループおよびさまざまなエンティティに対するオプトインアプローチ(DB内のすべてを監査する必要があるわけではないので、なぜそうするのか)。
次に、サービスと通信し、すべてのバージョンを表示できる軽量のWebサイトを構築します。追加/更新/削除を表示してバージョン間で比較するメカニズム(本当にクールなUI表現)を構築し、ユーザーが誰が何をいつ変更したかを確認できるようにしました。サービスは、URLへのリンクを返送して、エンティティのバージョンを表示できます。これにより、webaps + winform / wpfアプリでブラウザーを起動して、ユーザーが変更を確認できるようになります。
たぶんこれをパッケージ化し、誰かが興味を持っているかどうかを提供できます。...