2

我有一个员工和一个相应的员工历史表。

这两个表具有相同的结构。历史表用于跟踪员工在一段时间内所做的历史更改。

现在,我需要为对员工所做的更改添加撤消功能。

例如,员工头衔在 8 月 1 日更改。现在,这将更新 Employee 表中的员工职务,并在 employee_history 表中插入相应的历史记录。

现在,我需要撤消此更改。员工编辑页面将包含按日期对员工所做的更改列表,旁边有一个撤消按钮。

单击撤消应将 Employee 表中的更改恢复为以前的值。另外我认为历史表中标题已更改的记录也应删除。

此外,当我恢复对员工表的更改时,即将标题恢复为以前的标题,这将触发对历史表的​​插入,这是我不想要的。

我不确定这样做的最佳方法是什么。

任何建议都会有所帮助。

4

3 回答 3

2

如果您想实现“持久”撤消 - 可以在应用程序重新启动/会话超时后幸存下来,您应该考虑扩展您的数据库模式宽度timestamp字段并删除最后一个条目或将其替换为适当的较早条目。

“轻量级”版本将使用堆栈来存储最后的交互,包括原始值和新值。当然,您可以在会话失效时保留堆栈以结合这两种方法。这似乎是您实际在做的事情。

您可以通过为每个更改创建和存储或导出 SQL 迁移脚本、记录更改以及(如果可能的话)相反的操作来扩展此解决方案。因此,您甚至可以在应用程序实例和环境之间传输脚本,并拥有数据库状态的完整“可重放性”。

tl;博士 - 看起来您已经实施了一个很好的解决方案

于 2012-08-01T13:54:07.237 回答
0

我建议使用一个标志来告诉触发器/历史逻辑在您运行撤消并且不写入历史数据时保持关闭。

通常,这将通过从您的历史表中提供序列化程序类并恢复员工数据,然后再次清理历史条目/解锁历史来完成。

于 2012-08-01T13:45:43.780 回答
0

您也许可以使用事务的回滚功能。

于 2012-08-01T13:53:02.637 回答