允许用户通过SQLAlchemy从数据库审计日志回滚
我最近开始使用SQLAlchemy来做一个新项目,打算实现一个审计跟踪功能,类似于下面这些问题中提到的内容:
- 如何在C#中实现对象的审计跟踪?
- 审计跟踪和实施SOX/HIPAA等的最佳实践,适用于敏感数据
- 关于数据库设计以捕获审计跟踪的想法
- 数据库审计跟踪的最佳实现是什么?
- 这是创建审计跟踪的最佳方法吗?
- 为数据库应用程序留下审计跟踪/变更历史的有效策略?
- 在NHibernate和SqlServer中进行数据审计.
因为我会保存“有趣”对象的完整历史记录,所以我在想能否让用户回滚到某个特定版本,这样他们就可以无限次地进行撤销
操作。
用SQLAlchemy能否以一种干净的方式实现这个功能呢?
在内部API(业务逻辑和ORM)中,如何正确地展示这个功能呢?
我想的方式是像这样user.rollback(ver=42)
。
1 个回答
8
虽然我没有专门使用过SQLAlchemy,但我可以给你一些通用的建议,这些建议可以很容易地应用到任何对象关系映射(ORM)工具上:
- 把版本化的项目分成两个表,比如叫做
Document
和DocumentVersion
。Document
表里存放那些在不同版本之间永远不会改变的信息,而DocumentVersion
表里存放那些会改变的信息。 - 给每个
DocumentVersion
添加一个“父级”引用。也就是说,做一个外键,指向同一个表中的前一个版本。 - 如果想回到之前的版本,可以通过更新
Document
中的引用,指向“当前”的版本。不要从链条的底部删除版本。 - 当你在回滚之后创建新的版本时,这会形成另一个版本分支。
举个例子,创建 A、B、C,回滚到 B,然后创建 D、E:
(A)
|
(B)
| \
(C) (D)
|
(E)