我有下表:
Id INT/PK
UserId INT/FK
CreatedDate DATETIME
ActivityMarker INT/FK
该表可以写入(包括记录更新)并从中删除(例如,今天我可以删除2010年1月1日的记录)。 CreatedDate包含创建记录的日期。 ActivityMarker和UserId可以更新。
我需要做的是保存一份历史记录,记录每天有多少记录,给定UserId X,有ActivityMarker Y.我需要这些信息来为用户绘制他们在一段时间内给定标记的项目数量
据我所知,目前的表结构不支持这种历史信息;一旦有人更改了ActivitiyMarker或UserId的值,之前的值就会永远消失,我不知道更改何时发生。
有人可以建议保留这些信息的最佳方法,这样我最终可以获得给定UserId和ActivityMarker在特定日期的记录数量吗?
答案 0 :(得分:3)
使用有效的约会记录变化。
或
使用触发器审核到另一个表
或
看一下SQL 2008审核功能(可能在那里有一些东西,但我不确定它是否会在友好的功能中使用)。
有效约会是指您保留所有记录并通过某种日期逻辑或标记将其标记为当前活动的记录。这是一篇解释概念的文章 - http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/。
使用触发器审核相当普遍,您应该能够找到大量有关它的信息。
SQL审计是2008年的一项新功能 - 看起来它将对象上的交互转储到日志 - 可能只存储t-sql语句和用户ID,而不是列的实际值。
答案 1 :(得分:0)
你需要一个像这样的表
Id INT/PK -- alternately UserId + Rundate could be the PK
UserId INT/FK
RunDate DATETIME
AMCount INT
然后每天运行:
INSERT INTO HistoricalActivityMarkers( UserId, RunDate, AMCount)
SELECT UserId, GETDATE(), count(*)
FROM ActivityMarkerTbl
GROUP BY UserId, GETDATE()
由于您只需要每日记录,因此不需要触发器来记录每次更改,如果每天至少进行一次cahnge,也不会给您每日记录。
答案 2 :(得分:0)
如何将记录快照写入历史记录表?如果您在SQL Server中正常工作,则可以使用触发器。如果您使用ORM工具,有些人可以拦截更改。