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