代码之家  ›  专栏  ›  技术社区  ›  Alex

SQL Server-逻辑问题

  •  1
  • Alex  · 技术社区  · 16 年前

    我有下表:

    Id INT/PK
    UserId INT/FK
    CreatedDate DATETIME
    ActivityMarker INT/FK
    

    该表可以写入(包括记录更新)和删除(例如,今天我可以删除2010年1月1日的记录)。CreatedDate包含记录的创建日期。可以更新ActivityMarker和UserId。

    我知道当前的表结构不支持这种历史信息;一旦有人更改了activitymarker或UserId的值,以前的值就永远消失了,我也不知道更改是什么时候发生的。

    有人能建议保存这些信息的最佳方法吗?这样,我最终可以得到给定用户ID和活动标记的记录数,就像在特定的一天一样?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Sam    16 年前

    使用有效的日期来记录变化。

    或

    使用触发器审核另一个表

    看一看SQL2008审计特性(这里可能有一些东西适合您,但我不确定它是否是一个友好的特性)。

    http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/ .

    SQL Audit是2008年的一个新特性—看起来它将对象上的交互转储到日志—可能只存储t-SQL语句和用户ID,而不是列的实际值。

        2
  •  0
  •   Christoph Jonathan    16 年前

    将记录的快照写入历史记录表如何?如果您在SQL Server中工作正常,那么可以使用触发器。如果您使用的是ORM工具,有些工具可以截获更改。

        3
  •  0
  •   James Curran    16 年前

    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,它也无法为您提供每日记录。

    推荐文章