Hibernate および SqlServer でのデータ監査
-
08-06-2019 - |
質問
プロジェクトで NHibernate を使用しており、データ監査を行う必要があります。見つけました この記事 IInterceptor インターフェイスについて説明する codeproject で。
データを監査するための好ましい方法は何ですか?データベーストリガーを使用していますか?記事で説明されているものと似たものを使用していますか?
解決
NHibernate 2.0 については、以下も参照してください。 イベントリスナー. 。これらは IInterceptor インターフェイスの進化であり、監査に適切に使用されています。
他のヒント
[編集]
NH2.0 リリース後は、以下に示すようにイベント リスナーを確認してください。私の答えは古いです。
IInterceptor は、非侵襲的な方法で nhibernate のデータを変更するための推奨される方法です。また、アプリケーション コードが認識する必要のないデータの復号化/暗号化にも役立ちます。
データベース上のトリガーにより、ロギング (アプリケーションの問題) の責任が DBMS 層に移され、ロギング ソリューションをデータベース プラットフォームに効果的に結び付けることができます。監査メカニズムを永続化レイヤーにカプセル化することで、プラットフォームの独立性とコードの移植性を維持できます。
私は実稼働コードでインターセプターを使用して、いくつかの大規模なシステムで監査を提供しています。
私はあなたが言及した CodeProject アプローチの方が好きです。
データベース トリガーに関する 1 つの問題は、SQL Server へのアクセスとして統合セキュリティと ActiveDirectory を組み合わせて使用する以外に選択肢がないことです。その理由は、接続をトリガーしたユーザーの ID を接続が継承する必要があるためです。アプリケーションが名前付きの「sa」アカウントまたは他のユーザー アカウントを使用している場合、「user」フィールドには「sa」のみが反映されます。
これは、アプリケーションのユーザーごとに名前付き SQL Server アカウントを作成することで上書きできますが、これは、イントラネット以外の公開 Web アプリケーションなどでは現実的ではありません。
私は前述のインターセプターのアプローチが気に入っており、現在取り組んでいるプロジェクトでこれを使用しています。
ただし、強調すべき明らかな欠点の 1 つは、このアプローチではアプリケーションを介して行われたデータ変更のみが監査されることです。時々実行する必要があるアドホック SQL スクリプトなどの直接的なデータ変更 (常に発生します) は、監査テーブルの挿入を同時に実行することを忘れない限り、監査されません。
これは古い質問であることは理解しています。しかし、私は NH 2.0 の新しいイベント システムを考慮してこれに答えたいと思います。イベント リスナーは、インターセプターよりも監査のような機能に適しています。アイエンデ氏は先月、自身のブログに素晴らしい例を書きました。彼のブログ投稿の 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) を使用すると、監査が進行していることを他のコードに知らされることなく、すべてを構築できます。
もちろん、カスケード コレクションの要素をどのように監査するかはまったく別の問題です...