【发布时间】:2010-10-02 05:13:49
【问题描述】:
我们将一个实体拆分为 5 个不同的表。其中 3 个表中的记录是强制性的。其他两个表中的记录是可选的(基于实体的子类型)。
其中一个表被指定为实体主控表。其他四个表中的记录由 master 的唯一 id 键控。
在每个表上都存在更新/删除触发器后,记录的更改会将历史记录(从触发器内部的已删除表)保存到相关的历史记录表中。每个历史表都包含相关的实体字段 + 时间戳。
因此,实时记录始终位于实时表中,而历史记录/更改则位于历史表中。历史记录可以根据时间戳列进行排序。显然,timestamp 列在历史表中是不相关的。
现在,更困难的部分。
- 记录最初插入到单个事务中。单个事务中将写入 3 或 5 条记录。
- 可以对 5 个表中的任何一个或所有表进行单独更新。
- 所有记录都作为单个事务的一部分进行更新。同样,3 或 5 条记录将在单个事务中更新。
- 数字 2 可以重复多次。
- 数字 3 可以重复多次。
应用程序应该根据仅作为单个事务写入的记录(仅点 1,3 和 5)显示时间点历史条目列表
我目前在使用仅根据时间戳数据检索历史记录的算法时遇到问题。
添加一个 HISTORYMASTER 表来保存有关事务的额外信息似乎可以部分解决问题。在每笔交易之前,都会在 HISTORYMASTER 中添加一条新记录。新的 HISTORYMASTER.ID 在事务期间保存到每个实体表中。 可以通过选择特定 HISTORYMASTER.ID 的第一条记录来检索时间点历史记录(按时间戳排序)
对于跨多个表的实体,是否有更优化的方法来管理基于 AFTER(UPDATE、DELETE)TRIGGER 的审计表?
【问题讨论】:
-
“历史记录点可以被检索...按时间戳排序”在我们的历史记录表中的行可以改变得比日期时间的粒度(我认为是 3 毫秒)更快,所以我们还有一个 EditNumber 列增加了UPDATE 触发器 - 正如其他人所说,“版本”可以绑定子历史记录
标签: sql-server triggers history logging audit