2009-08-03 14 views
0

現在、SQL Server 2005を使用して、「ウィンドウズイベント」データベースをポーリングして、タイムスタンプフィールドを持つWINDOWS_EVENTSというテーブルの変更を判断します。タイムスタンプを見ると、行が変更されたかどうかを判断できますが、その行のどのフィールドが変更されたかはわかりません。データベースに依存しない方法で、フィールドレベルでデータ変更通知を取得できますか?

フィールドレベルの変更を検出するための一般的な(つまり、データベースに依存しない)方法はありますか? (私はそれが一般的である必要があります。なぜなら、顧客がどのデータベースを使用するのかわからないため、Notification Servicesや他のSQLサーバー固有の技術を使用したくないからです。 。それは私が私の問題を解決するのに役立ちます場合は、他の言語)

+0

Ionnoしかし、データベースに依存しないようにするには、ORMが必要なようです。 – mpen

+0

@マーク、nHibernateで可能なものが必要でしょうか?また、私はORMがいつでも約100,000レコードのテーブルに適しているかどうかはわかりません(100,000を超えないでしょう)。 – Liao

答えて

0

まず、私はこのような何かからあなたのテーブル構造を変更することをお勧めします:

id  field1 field2 field3 field4 timestamp 

このようなものに:

Table 1 
------- 
id  fieldKey value timestamp 
1  1   42  12:03am 
2  3   'Cow' 1:45am 
3  2   'Moo' 2:33am 
4  4   99  3:59am 

Table 2 
------- 
fieldKey  fieldLabel 
1   Field One 
2   Field Two 
3   Event One 
4   Event Two 

セカンド、あなたはコピーであなたが望むものを達成することができます古い値を入力するか、フィールド値のハッシュを計算し(長いフィールド用)、別のフィールド(oldField1、oldField2など)にタイムスタンプとともに格納してから、テーブルをポーリングします。私はすべてのデータベースがSHA1( 'xyz')やMD5( 'abc')のようなハッシュ関数を持っていると信じています。

変更のためにテーブルをポーリングすると、変更された行が表示され、フィールド比較によってフィールドが変更されたことを確認できます。したがって、field1をoldField1、field2をoldField2、field3をoldField3などと比較します。ブロブの場合、SHA1(field4)とoldField4を比較できます。

タイムスタンプを更新するときにフィールドをコピーするストアドプロシージャトリガを作成します。

もう1つの解決策は、変更を保存するだけのデータ変更ログテーブルを作成することです。これはトリガストアドプロシージャを介して挿入され、それはこのようになります

id tableName  rowKey fieldName  oldValue  newValue  timestamp 
1  WINDOWS_EVENTS 42  event1  stable  crash  4:44am 
関連する問題