プロジェクトで NHibernate を使用しており、データ監査を行う必要があります。IInterceptor インターフェイスについて説明している codeproject に関するこの記事を見つけました。
データを監査するための好ましい方法は何ですか? データベーストリガーを使用していますか? この記事で説明されているものに似たものを使用していますか?
プロジェクトで NHibernate を使用しており、データ監査を行う必要があります。IInterceptor インターフェイスについて説明している codeproject に関するこの記事を見つけました。
データを監査するための好ましい方法は何ですか? データベーストリガーを使用していますか? この記事で説明されているものに似たものを使用していますか?
NHibernate 2.0 の場合は、Event Listenersも確認する必要があります。これらは IInterceptor インターフェイスの進化であり、監査に使用して成功しています。
[編集]
NH2.0 のリリース後、以下に示すイベント リスナーを参照してください。私の答えは時代遅れです。
IInterceptor は、非侵襲的な方法で nhibernate のデータを変更するための推奨される方法です。アプリケーションコードが知る必要のないデータの復号化/暗号化にも役立ちます。
データベース上のトリガーは、ロギングの責任 (アプリケーションの問題) を DBMS レイヤーに移し、ロギング ソリューションをデータベース プラットフォームに効果的に結び付けます。監査メカニズムを永続化レイヤーにカプセル化することで、プラットフォームへの依存性とコードの移植性を維持できます。
私は実稼働コードでインターセプターを使用して、いくつかの大規模システムで監査を提供しています。
私は言及されたインターセプターのアプローチが好きで、現在取り組んでいるプロジェクトでこれを使用しています。
ただし、注目に値する明らかな欠点の 1 つは、このアプローチではアプリケーションを介して行われたデータ変更のみが監査されることです。時々実行する必要があるアドホック SQL スクリプトなどの直接的なデータ変更 (常に発生します) は、監査テーブルの挿入を同時に実行することを覚えていない限り、監査されません。
あなたが言及したCodeProjectアプローチを好みます。
データベース トリガーの問題の 1 つは、SQL Server へのアクセスとして ActiveDirectory と組み合わせた統合セキュリティを使用する以外に選択肢がないことです。その理由は、接続が接続をトリガーしたユーザーの ID を継承する必要があるためです。アプリケーションが名前付きの「sa」アカウントまたは他のユーザー アカウントを使用する場合、「user」フィールドには「sa」のみが反映されます。
これは、アプリケーションのすべてのユーザーに対して名前付きの SQL Server アカウントを作成することでオーバーライドできますが、これは、たとえば、イントラネット以外の公開 Web アプリケーションでは実用的ではありません。
これは古い質問であることを理解しています。しかし、NH 2.0 の新しいイベント システムに照らして、これに答えたいと思います。イベント リスナーは、インターセプターよりも監査のような機能に適しています。Ayende は先月、彼のブログで素晴らしい例を書きました。彼のブログ投稿の URL は次のとおりです。
まったく別のアプローチとして、リポジトリでデコレータ パターンを使用できます。
私が持っていると言う
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
次に、NHibernateRepository を作成します。
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
session.SaveOrUpdate(entity);
}
}
次に、監査リポジトリを作成できます。
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
entity.LastUser = security.CurrentUser;
entity.LastUpdate = DateTime.UtcNow;
innerRepository.Save(entity)
}
}
次に、IoC フレームワーク (StructureMap、Castle Windsor、NInject) を使用すると、監査が行われていることを常に認識している残りのコードなしで、すべてを構築できます。
もちろん、カスケードされたコレクションの要素をどのように監査するかは、まったく別の問題です...