2011-09-14 4 views
2

要件は単純だと思われます。データが変更されると、変更を監査します。EFまたはSQLは、データの変更を監査するためのより良い選択ですか?

ここで式にはいくつかの重要な部分です:

  1. データは自分のアプリケーションで複数のテーブル(。いくつかのクロス参照テーブル)をまたがります。
  2. 私のDTOは深く、条件付きでナビゲーションプロパティが設定されています。
  3. ロードすると、元のDTOを元の値でコピーします。
  4. 保存が要求されると、元のDTOに変更が含まれます。
  5. 理想的には、外部キーはID番号ではなく有用なテキストのように読み込まれます。

TFSのクールヒストリ機能とは異なり、多くの関連テーブルと条件付き子エンティティのため、私のほうが複雑に思えます。が

  1. 私はオブジェクトを反映するためにC#を使用して、前/後の記録を作成することができます。

    は、私は三つの可能性(これまで)を参照してください。

  2. SQL 2008R2でトリガを使用して変更をキャッチし、前後のレコードを結合することができました。
  3. 私は生の前後のオブジェクトを格納して、SQL 2008R2でそれらを解析させることができました。

注意:現在、私はSQL 2008R2のCDCはあまりにも多くの選択肢があります。私は本当に私が作ることができるものを探していますが、私は今私の心が何にでも開いていることを認めています。

私の質問

私はこの建物を始める前に: は他にどのように誰もが複雑なEF DTOを監査処理しますか?

低(ish)テックソリューションはありますか?

ありがとうございます。 StackOverflowの上ですでに

関連ではなく、完全に関連の質問:Implementing Audit Log/Change History with MVC & Entity FrameworkCreate Data Audit in SQL Serverhttps://stackoverflow.com/questions/5773419/how-to-audit-many-to-many-relationship-in-entity-frameworkMaintaining audit log for entities split across multiple tablesLinq to SQL Audit Trail/Audit Log: should I use triggers or doddleaudit?は答えを提供していません。

+1

SQL Serverのネイティブ監査機能を選択肢として表示しない理由がわかりません。 –

+0

申し訳ありません@Craig、あなたは私のDBAについて間違った仮定をしました。これは単に現在のスキルセットの外にあり、ソリューションチームがIT部門から要求する悪夢(そして無限の遅れ)を作り出します。ただ現実だから、私はそれを除外したのです。 –

+0

まあ、彼らがそれを知らない場合でも、それは少なくとも文書化されています。 –

答えて

0

トリガーソリューション、長所:

  1. は監査できません非SQLデータ
  2. は、インサート上の複雑なオブジェクトを監査することはできません:

    1. 監査

    トリガーソリューション、短所を回避することはできません

Entity Frameworkの、長所:

  1. をバイパスすることができます(ダイレクトよう:
  2. すべてがどのような状態で

Entity Frameworkの、短所を複雑なオブジェクトを監査でき

  1. を監査することができますto-SQL)
  2. 元の値のコピーが必要

私の選択はEntity Frameworkです。 STEを使用すると簡単になります。

いずれにしても自分自身をロールバックする必要があります。

1

私は最近、Entity Frameworkの上に監査ログマネージャを実装しました。監査マネージャーをインスタンス化すると、すべてのエンティティークラスが反映され、プロパティー情報が保管されます。次に、オブジェクトコンテキストSavingChangesイベント内で、すべての変更を監査します。それは素晴らしい作品です。外来キーの場合、変更の前後にIDの前後を保存します。

このソリューションの素晴らしい点は、余分なコーディングを必要としないことです。ソートのログマネージャを作成したら、新しいトリガの追加や新しいカラムが追加されたときのトリガの変更について心配する必要はありません。エンティティクラスの変更は、クラスを反映するときに自動的に選択されます。

+0

申し訳ありませんが、@ Mservidio、EFに問題があります。あなたがキーを持っていないインサートの状況を考えてみましょう。おそらく、親レコードにキーがある(またはそうでないかもしれない)場合があり、挿入後にデータベースによってキーが割り当てられていない子供がいるかもしれません。問題は、レコードを参照しない監査レコードを作成することです。また、このアプローチでは、デフォルトまたはトリガーに影響を与えた値の2番目の問題をすべて逃してしまうことをお勧めします。 –

+0

良い点@ジェリー・ニクソン。私はエンティティフレームワークを1ヶ月前にコーディングしました。あなたが言ったことは本当です。私のケースでは、新しいエンティティの作成のためのIdを必要としないので、作成しなくても使用できます。変更と削除にはキーがあります。ただし、保存されたエンティティを追跡し、保存後、自動生成された列と計算された列が取得されてログに記録された後にログを記録できると思っています。 – mservidio

+0

私は今これに戻ることができるかどうかを見直すために戻ってきます。もちろん、このアプローチの欠点は、変更後にロギングが発生するため、ロギングで問題が発生した場合には必ず保証ログになりません。したがって、堅実な監査プロセスが必要な場合は、取る方が良いアプローチではないということに同意しました。最初の作成時にIDを必要としない軽量なログだけが必要な場合は、いいです。続行するには... EFの変更を保存した後、IDが私の監査ログに引き込まれるようにすれば、アップデートを提供します。 – mservidio

2

監査が本当の要件である場合、私はトリガー溶液を選ぶでしょう...他の方法は、いくつかの「欠点」があるので:アプリケーション以外の手段で起こった変更に

  • 「ブラインド」あなたには、いくつかのコードを変更すると、監査証跡が唯一の特別なユーザでも監査されたデータを見ることができるように「盲点」

トリガーベースのソリューションを確保することができる取得する監査コードを追加することを忘れた場合

  • .. 。

    私は通常Oracleと一緒に作業していますが、そのような状況での私の経験から:ビューを介してアプリケーションにSELECT権限を与え、ストアドプロシージャを使用して挿入/削除/更新を実行し、トリガーによって監査証跡を実行する必要があります...

  • +1

    スポットがあります。また、トリガーは、SUSER_SNAME()を使用してログインしているユーザーのユーザーIDを取得し、SQL Serverの組み込み監査機能では行えないデータ行を変更することができます。 – HardCode

    +0

    申し訳ありません、@HardCode(およびYahia)、トリガーに問題があります。相互参照テーブルの反対側に新しいデータレコードがあるとします。これはトランジションのクロスレコードの前に作成されます。つまり、挿入されたレコードを親レコードに関連付けることはできません。つまり、監査は孤立したレコードになります。削除されたテーブルが範囲内にあるので、変換で操作することは重要です。どのようにそれを解決することができますか? –

    +0

    @ジェリー・ニクソン - あなたのデータモデルがそれに応じて構築されていれば、監査エントリを相互に関連付けることができます。必要に応じて、記載されたSPメソッドを使用して監査を強化することができます。あなたが記述した問題は決してありませんでしたか(または、おそらく私がちょうどあなたが意味するものを理解していませんか?)... – Yahia

    1

    さて、見てみましょう。 SQL Server auditingが既に存在し、ツールが付属しています。おそらくあなたのDBAが既に知っているでしょうし、あなたのアプリの速度を落とさず、events that the application itself will never even seeをトレースできます。

    一方、EFで自分自身をロールバックすると、非SQL Serverデータソースを監査することができます。また、EEは必要ありません。

    関連する問題