实现数据库记录哈希以跟踪记录是否已更改

Kei*_*Jr. 6 database hash

我有一个集成项目的数据库模式,我需要能够在其中查询已更改的记录,但仅基于该记录中的给定字段集.

所以,例如,这是一个示例表:

顾客

  • ID
  • 名称
  • 电话
  • 传真
  • 平衡

我需要查询以获取其名称,电话或传真字段已更改的记录.但是,不应考虑其他字段,即如果只有Balance字段更改,我的查询不应该拉入该记录(因此,每当修改记录时,自动更新的时间戳字段不起作用).

此外,这必须在许多不同的数据库和平台上运行,因此除非它们在M​​ySQL,PostgreSQL,SQL Server和SQLLite上运行,否则TRIGGERS或类似的东西不是真正的选择.

这些字段由我无法修改的第三方应用程序修改,因此我不能只添加标志并让第三方应用程序在修改相关字段时将标志设置为TRUE.

我最初的解决方案是计算相关字段的HASH并将其存储在新字段"LastHash"中.然后,我可以计算当前记录中数据的相关字段的哈希值,如果它与存储的LastHash不匹配,我知道它已被更改.

这看起来很混乱......但似乎它会起作用.有没有更好的办法?如果没有,是否有一种很好的方法来实现该哈希,以便提取那些已更改的记录是有效的,而不是太耗时?

编辑

一些说明:我的应用程序其他应用程序都更新并插入到这些表中.我可以让我的应用程序计算初始哈希值.我不能让其他应用程序计算它.

每当记录更改都可以自动更新的时间戳列,这些列很容易在使用不同列类型或非常简单的触发器的所有数据库系统中进行复制.

其他问题

如果哈希是要走的路......有没有任何有效的哈希算法,不会永远计算所有这些记录?MD5或SHA1可能会起作用,但它们看起来像是sllloowwww.

Cad*_*oux 3

这是一项艰难的任务。您仍然需要进行表扫描(或索引扫描),因为您必须计算新的哈希值并将其与存储的旧哈希值进行比较。

如果由于跨平台问题而无法使用触发器,则您可以让数据库引擎计算当前哈希(即持久计算列 - 有效地像触发器一样)。但这也是跨平台问题!然后,如果您对当前哈希和您的哈希建立索引,那么搜索就会相对容易一些。

您至少可以使用时间戳字段来减少需要检查的哈希数吗?

另一件要记住的事情是,不存在完美的哈希函数,因此您可能会出现漏报(无意的哈希冲突导致未检测到更改)。这个(天文数字般的小)风险值得冒吗?