每行的sql历史记录

6yoyoihd  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(452)

我知道有一些方法可以创建审计表,以便在sql中获取整个表的更改历史,例如:
是否有mysql选项/功能来跟踪记录更改的历史?
但是,我想知道是否有一种方法可以获取特定行的更改历史记录,即表中第1行的编辑记录。如果有办法做到这一点,我将不胜感激。谢谢!

3yhwsihp

3yhwsihp1#

我通常建议你再来一次 history_x 一张一张的table x . history_x 在这种情况下,与 x ; 它的不同之处在于它是 x 的主键不是主键(即使“x”是,也不会自动递增),并且它有自己的主键,有时还会进行某种加法 changed_when 日期时间字段。
然后触发两个触发器: AFTER INSERT ON x 基本上只是克隆一个新的行 x
history_x AFTER UPDATE ON x 只是克隆了行的新状态 xhistory_x 如何处理删除。通常,如果你想删除 x 记录,可以删除相应的历史记录。如果你只是在标记 x 作为“退休”,这是由更新处理涵盖。如果删除后需要保留历史记录,只需添加 x_deleted “flag”字段和一个delete触发器,该触发器克隆行的最后一个状态,但设置 x_deleted 把历史上的旗帜改为“真”。
而且,这显然不跟踪pk对 x ,但如果 history_x 有两份 x 的pk;一个是触发器与其余字段捕获的历史pk值,第二个绑定到外键,外键将级联所有旧历史以引用新键。
编辑:如果你可以利用session/@变量的半全局性,你甚至可以添加诸如谁做了更改之类的信息;但连接池通常会对此产生干扰(每个连接都是它自己的会话)。
编辑#2/警告:如果您存储的是blob或大文本字段等大数据,则可能不应在每次更新时克隆它们。
哦,是的,“更改的时间”数据也可以更有用,如果表示为 valid_from 以及 valid_until 一对字段。 valid_until 对于最新的历史记录,应该为null,并且在添加新的历史记录时,前一个最新的历史记录应该具有 valid_until 字段集。 changed_when 对于日志来说已经足够了,但是如果需要实际使用旧值 WHERE ? >= valid_from and ? < valid_until 比以前容易多了 WHERE valid_until < ? ORDER BY valid_until DESC LIMIT 1

yzckvree

yzckvree2#

根据我的想法,你要做的是 RowNumber() 在查询中。
请参阅此处了解更多详细信息。

pb3s4cty

pb3s4cty3#

我们过去所做的是改变历史表格。第一个是:改变历史
Chu id主键
表名称用于更改的表的名称
桌上的pk桌上的pk桌上的pk桌
键入insert、update、delete
变更日期变更日期
是谁做的
其次是:改变历史细节
冠心病id pk
频道id
列名
旧价值
新价值
然后我们在table上使用触发器。不能使用存储过程来捕获信息,因为DBA在进行数据更改时通常不使用存储过程。然后可以按表名和感兴趣的记录的主键进行查询。您还可以将屏幕名称添加到第一个表中,以使您能够获取对该屏幕上的记录所做的所有更改。

相关问题