是否有一些与数据库无关的方式在现场级别获取数据更改通知?

问题描述 投票:0回答:1

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

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

sql-server notifications
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
© www.soinside.com 2019 - 2024. All rights reserved.