代码之家  ›  专栏  ›  技术社区  ›  Keith Palmer Jr.

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

  •  8
  • Keith Palmer Jr.  · 技术社区  · 16 年前

    我有一个集成项目的数据库模式,我需要能够在其中查询具有以下内容的记录 改变 但仅基于给定的字段集

    例如,这里有一个示例表:

    客户

    • ID
    • 名字

    我需要查询以获取姓名、电话或传真字段已更改的记录。但是,不应考虑其他字段,即如果 ,我的查询 不应 将该记录拉入(因此,当记录被修改时,时间戳字段会自动更新 不起作用

    此外,这必须在许多不同的数据库和平台上运行,因此触发器或类似的东西不是一个真正的选择,除非它们在MySQL、PostgreSQL、SQL Server和SQLLite上运行。

    我最初的解决方案是计算相关字段的哈希值,并将其存储在新字段“LastHash”或其他类似字段中。然后,我可以计算记录中当前数据的相关字段的哈希值,如果它与存储的LastHash不匹配,我就知道它发生了变化。

    这看起来相当混乱。..但似乎会奏效。有更好的方法吗?如果没有,是否有一种好的方法来实现哈希,这样提取这些更改的记录既高效又不太耗时?

    编辑

    另一个应用程序更新并插入到这些表中。一、

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

    附加问题

    sllloowwww .

    2 回复  |  直到 16 年前
        1
  •  2
  •   Cade Roux    16 年前

    如果由于跨平台问题而无法触发,您可以让数据库引擎计算当前哈希值(即持久计算列,有效地像触发器一样)。不过,这也是跨平台的问题!然后,如果你对当前哈希值和你的哈希值进行索引,这是一个相对容易的搜索。

    另一件要记住的事情是,没有完美的哈希函数,所以你可能会有假阴性(无意中的哈希冲突导致无法检测到变化)。这个(天文数字般的小)风险值得冒吗?

        2
  •  0
  •   KM.    16 年前

    我会标准化你的应用程序如何检查差异,而不是数据库如何实现差异。尝试使用带有特定列的视图来表示更改。然后使用每个数据库中实现的适当技巧来实现该视图。依赖于检查此差异的代码将是相同的,使用相同的视图和列。