2010-12-10 5 views
1

特定のms SQL 2005テーブル(asp.net Webアプリケーション、C#Windowsサービス、電子メールパーサーをデータベース自動化ツールsql + VB)を使用します)、監査情報をテーブルに格納します。例えば。 ModifiedBy、ModifiedDateここでModifiedBy =レコードを更新するアプリケーションの名前。複数のアプリケーションで共有されるSQLデータベースに監査情報とアーカイブ情報を生成する最も簡単な方法

また、テーブルに情報をアーカイブしたいと思います。特定のレコードを更新する場合は、現在のレコードをmyTable_Archiveテーブルに格納し、日付をスタンプして、それに応じてmyTableの現在のレコードを更新します。

これを解決するには、既存アプリケーションの影響を最小限に抑えつつ、維持管理が容易でテスト可能なアプローチは何ですか?あるいは誰かがより良いルートを提案することができますか?ストアプロシージャ、C#共有ライブラリ(nhibernate/ado.netなどを使用)、またはms sql 2005ビルトインフィーチャ(たとえば、あれば)を呼び出します。

答えて

2

この種の監査を行うための最もメンテナンス可能な(そしてかなり標準的な)方法は、問題のテーブルでtriggersを使用することです。

データベース内に完全に存在するため、アプリケーションはまったく変更されません。

もちろん、トリガーはパフォーマンスに影響します(呼び出しで複数の表が変更されるため)。

+0

経由の名前を取得することができます。呼び出し元のアプリケーションまたはプロセスを決定するトリガーには、ModifiedBy(アプリケーション名)フィールドでそのメソッドを使用できる方法がありますか? –

+0

@ルーク・ハットン - 接続文字列にこの情報が含まれている限り、システムテーブルからそれを取得できるはずです。 @Conrad Frix – Oded

+0

からの回答を参照してください、このルートを下ります、トリガーの周りにいくつかのテストを作成します。 –

2

私は最も簡単なものが経由トリガーであることを発見しました。 ModifiedBy = Application Nameの要件を取得するには、2つのことを行う必要があります

1)接続文字列を更新してアプリケーション名 を設定します。 ..Database=Foo;Application Name = Parser;

2)次に、あなたのトリガでは、おかげで、それが最も可能性の高い私のシナリオを解決するだろう小さな変更の提案だ

select program_name from sys.dm_exec_sessions where session_id = @@SPID

+0

修正された回答の+1 –

関連する問題