データベースに依存せずにフィールドレベルでデータ変更通知を取得する方法はありますか?

StackOverflow https://stackoverflow.com/questions/1221106

  •  10-07-2019
  •  | 
  •  

質問

現在、SQL Server 2005を使用して、「windows events」をポーリングしています。タイムスタンプフィールドを持つWINDOWS_EVENTSというテーブルの変更を決定するデータベース。タイムスタンプを見ると、行が変更されたかどうかを判断できますが、その行のどのフィールドが変更されたかは判断できません。

フィールドレベルの変更を検出するための一般的な(つまり、データベースに依存しない方法)がありますか? (顧客がどのデータベースを使用するかわからないため、汎用である必要があります。したがって、Notification Servicesやその他のSQL Server固有のテクノロジを使用したくありません。.NET、Java、または任意のソリューションを使用できます問題の解決に役立つ場合は他の言語を使用してください。)

役に立ちましたか?

解決

まず、テーブル構造を次のようなものから変更することをお勧めします。

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などを比較します。blobの場合、SHA1(field4)とoldField4)を比較できます。

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

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

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top