2012-04-25 13 views
0

私は、多階層の.NET 4 WPF、WCF、SQL 2008アプリケーション内のさまざまな "システムレベルのメッセージ"を監視し、記録する課題に取り組んでいます。ユーザーがログアウトしたりログアウトしたり、データが保存されたりするなど、私たちのアプリケーションで発生したイベントについては、ログに記録されます。SQLデータベーステーブルの変更を監視するための設計上の考慮事項

これらのメッセージのソースは、Windowsサービス、IISのWCFホスト、データベース内のストアドプロシージャなど、アプリケーションのいくつかの異なるコンポーネントから来る可能性があります。最終的にこれらのコンポーネントはそれぞれ独自の方法でSQLテーブルを変更します。これらのコンポーネントのそれぞれを独立して攻撃する私は、SQLの特定のテーブルが変更(更新、挿入)されたときに、メッセージがトリガされる必要があると言って簡単にできると思っています。

最初に気になるのは、変更を監視し軽量メッセージテーブルにレコードを挿入する各テーブルのトリガーです。私はいつも(99%の時間)データベースのトリガーが悪いニュース(Are database triggers evil?)であるという考え方をしてきました。私は個人的には、C#をSQLトリガーよりも開発してデバッグする方がはるかに多くなります。

代わりに、私はUsing SqlDependency to Monitor Database Changesにアクセスして、SqlDependencyクラスを使用して変更を検出する方法について説明しました。概念の迅速な証明がうまくいくようです。ただし、いくつかのコードサンプルを確認した後は、検出された変更ごとに新しいSqlConnection、SqlCommand、およびSqlDependencyオブジェクトを再初期化する必要があり、監視する必要があるクエリが3つまたは4つ必要になることがあります。

C#でSQLテーブルの変更を検出するためのより良いオプションがありますか?

また、トリガーバイアスは別として、単に別のテーブルにデータを再挿入するために、単に1組のテーブルの変更を監視することのように思えます。私はむしろC#で実装する必要があるいくつかの他のロジックがありますが、私はこれを行うためにトリガを書く必要がありますか?

思考?

答えて

0

私は一般的にトリガーに対するあなたの偏見は根拠がないと思います。人々はカーソルを見下ろすのと同じ理由でトリガーを見下ろします。多くの場合、誤用され、虐待されます。しかし、多くのもののように、彼らは確かに彼らの場所を持っており、正しく使用された場合、正しい答えです。

あなたになりますいくつかの他のネイティブの技術があります。

変更の追跡は
http://msdn.microsoft.com/en-us/library/cc280462(SQL.100).aspx

チェンジ・データが
http://msdn.microsoft.com/en-us/library/bb522489(SQL.100).aspx

SQL Serverの監査
http://msdn.microsoft.com/en-us/library/cc280386(SQL.100).aspx

汝をキャプチャgh私はあなたのエディション(これらのいくつかはエンタープライズ機能)を知らない。一部のサードパーティーのソリューションも存在します(私は検索/リサーチに任せていますので、何も使用していません)。

+0

クイックレスポンスありがとう!おそらくあなたは正しい。確かにこの場合(私の研究に基づいて)、私はトリガーが非常に単純にものだと思う。 –