0

目前,使用 SQL Server 2005,我轮询“windows 事件”数据库以确定名为 WINDOWS_EVENTS 的表中的更改,该表具有时间戳字段。查看时间戳,我可以确定该行是否已更改,但不能确定该行中的哪个字段已更改。

是否有一些通用的(即独立于数据库的方式)来检测字段级别的变化?(我需要它是通用的,因为不知道客户会使用什么数据库,所以我不想使用通知服务或其他特定于 SQL Server 的技术。我可以使用任何解决方案,.NET、Java 或任何其他语言,如果这有助于我解决我的问题。)

4

1 回答 1

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 等进行比较。对于 blob,您可以将 SHA1(field4) 与 oldField4) 进行比较。

创建存储过程触发器以在更新时间戳时复制字段。

另一种解决方案是创建一个仅存储更改的数据更改日志表。它将通过触发器存储过程插入,它看起来像这样

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
于 2009-08-03T08:21:26.887 回答