mysql - 更新表时跟踪行中的实际更改

标签 mysql algorithm audit-logging

我有一个表格,我会根据我代码中其他来源的值不断更新。我更新的值可能与行中已有的值相同,也可能不同。

我需要某种算法可能是通过 mysql (db) 或其他方式(部分代码),以便我以后可以识别哪些行具有已更改的值。

我更改了一个日期修改列。但这不是真正的指标,因为它会一直更新。我想要一种方法来确定某些预定义的列是否已更改值,

一个解决方案是:我可以执行一个选择查询,然后比较并更新表中已更改的标志。但这似乎很复杂,对我来说并不复杂,因为我有一张包含很多记录的表

另一种解决方案可能是将值的 md5 校验和保存在列中,并在更新时比较以前的 md5 和当前的 md5 等等。

我想知道最好的解决方案。

最佳答案

有一种相当简单的方法可以处理这个问题。让我们将其视为管理何时更新行的时间戳。

首先,我相信您知道,您的表需要一个具有 INSERTUPDATE 默认设置的时间戳列。如果该列名为 ts,则看起来像这样。

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

其次,您可以使用这样的 UPDATE 查询来更改行中的值。

UPDATE stock
   SET val1 = 'newval1', 
       val2 = 'newval2', 
       changed_by = 'current_user_id'
 WHERE id = 'id_to_change'
   AND NOT (val1 == 'newval1' AND val2 == 'newval2')

WHERE 上的 AND NOT 子句将阻止更新发生,除非 'newval1''newval2' 实际上会提供新的值。这是有效的,因为没有行匹配更新中的 WHERE 子句。

当阻止更新发生时,您自动设置的 ts 列将不会更改。 changed_by 列也不会设置为当前用户的 user_id。所以,你有时间和用户最近真正的变化。

此外,许多 MySQL 的宿主语言接口(interface)都有一个方法调用来确定最近的 UPDATE 操作影响了多少行。使用此技术,当行未更新时,您将返回零行。这对于您的用户界面来说可能很方便。

此外,此技术使用单个查询,因此如果多个用户同时尝试更新同一行,它是安全的。无需使用事务来保证这一点。

(请注意,跟踪 changed_by 用户是可选的,并且仅当您的应用程序可以提供当前用户的实际 ID 时才有效。)

只要数据库搜索 WHERE id = 'id_to_change' 工作得很快,这就相当有效。

它确实需要重新处理应用程序的更新查询。但是解决这个问题的任何其他方法也是如此。

关于mysql - 更新表时跟踪行中的实际更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383008/

相关文章:

mysql - SQLSTATE[42S22] : Column not found: 1054 Unknown column 'id' in 'where clause' (SQL update. .) 其中 `id` 为空)

C++ 子集总和 2^n/递归错误/澄清

MySQL 记录被修改?

python-2.7 - 如何更改 Python 日志记录中的时区?

azure - Powershell Get-AzureADAuditSignInLogs 未返回预期数量的日志

mysql - 通过 Rails 调用带 OUT 参数的 MySQL 存储过程

php - 无法使更新查询工作

mysql - MySQL 删除行的死锁

algorithm - 最小化矩阵中的 block

C# 匹配不同列表中的项目