我有一名员工和一份相应的员工历史表。
两个表都具有相同的结构。历史记录表用于跟踪在一段时间内对员工所做的历史更改。
现在,我需要在对员工所做的更改中添加撤消功能。
e.g。员工职称于8月1日更改。现在,这将更新Employee表中的employees标题,并在employee_history表中插入相应的历史记录。
现在,我需要撤消此更改。员工编辑页面将包含对员工日期所做的更改列表,旁边有一个撤消按钮。
单击撤消应将Employee表中的更改还原为以前的值。另外我认为历史表中记录标题的记录也应该被删除。
此外,当我恢复对employee表的更改,即将标题恢复为以前的标题时,这将触发对历史表的插入,这是我不想要的。
我不确定最好的方法是什么。
任何建议都会有所帮助。
答案 0 :(得分:2)
如果你想实现一个“持久”撤销 - 一个在应用程序重启/会话超时后仍然存在的撤销,你应该考虑扩展你的数据库架构宽度timestamp
字段并删除最后一个条目或用它替换它适当的早期条目。
“轻”版本将使用堆栈存储最后的交互,包括原始值和新值。当然,你可以在会话失效时保持堆栈以结合两种方法。这似乎就是你实际在做的事情。
您可以通过为每个更改创建和存储或导出SQL迁移脚本来扩展此解决方案,记录更改,如果可能,还可以执行相反的操作。因此,您甚至可以在应用程序实例和环境之间传输脚本,并且具有数据库状态的完全“可重放性”。
tl; dr - 看起来你已经实施了一个很好的解决方案
答案 1 :(得分:0)
我建议使用一个标志告诉触发器/历史逻辑在你运行undo并且不写历史数据时保持关闭。
通常情况下,这可以通过历史记录表中的序列化程序类提供并恢复员工数据,然后再次清理历史记录条目/解锁历史记录来完成。
答案 2 :(得分:0)
您可以使用交易的回滚功能。