目前,使用SQL Server 2005,我轮询“Windows事件”数据库以确定名为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