【问题标题】:Persisting data from SQL tables day by day每天从 SQL 表中持久化数据
【发布时间】:2016-12-03 13:14:20
【问题描述】:

我为一家小公司管理数据层应用程序,我的软件因无法从历史上检索到零件成本信息这一事实而受到批评。例如,他们希望能够在任何时间点恢复 6 个月前的零件成本。

他们过去常常通过电子表格来做到这一点。他们每天都会将零件表复制到一个 .xlsx 文件中,然后任何时候他们想知道“嘿,去年 1 月 20 日那个零件的成本是多少?”,他们可以在 excel 中将其拉出来。

所以,我们已经开始在 SQL 中做同样的事情,到目前为止的计划是,我们将在每次更新零件成本时创建一个新表,将表命名为今天的日期,并将其保存在数据库中用于存档信息。然后,我们计划根据时间戳提取我们需要的任何表。

我不禁认为这会变得非常混乱。这是归档数据的坏方法吗?有没有我可以遵守的行业标准来尽可能少地解决这个问题?

【问题讨论】:

  • 你是对的,这是一个糟糕的方法。动态命名的表使编写查询变得困难。相反,您可以简单地将 datestamp 列添加到相关表中。您可以为当前值和以前的值设置单独的表(但对于所有以前的值仍然只有一个表)。

标签: sql


【解决方案1】:

所以,我们已经开始在 SQL 中做同样的事情,目前的计划是 每次更新零件成本时,我们都会创建一个新表, 用今天的日期命名表,并将其保存在数据库中 存档信息。然后,我们打算拉入任何一张桌子 我们需要根据它的时间戳。

我不禁认为这会变得非常混乱。这是一个坏 归档数据的方法?有什么行业标准我可以 坚持以尽可能少的麻烦来解决这个问题?

你是对的......这个解决方案会很混乱。

您可以做的最简单的事情是创建一个历史记录表,例如 Parts_History,它将所有列作为主要的 Parts 表,并添加额外的时间戳列来跟踪更新。每次有一个零件的新价格(我希望通过存储过程完成)时,现有价格都会被移动到新表中,并且主表会更新ALL在一个事务中。如果您没有单个 SP 来处理更新,那么您可以在触发器中执行此操作。

我会试试看有没有好的例子。

【讨论】:

  • 因此,不是每次更新时都复制表,而是将旧版本的部分复制到Part_History,并用新值覆盖活动记录。然后可以通过应用于创建记录的时间戳来查询历史数据。我不敢相信我没有想到这一点。谢谢。
  • @Jace 欢迎您。看看富人 :) SQL 2016 中可用的跟踪/审计选项:msdn.microsoft.com/en-us/library/dn935015.aspx
【解决方案2】:

就我而言,目前还没有标准,但方法相当明显。你有一张桌子说part(partid int primary key, price decimal)。创建审计表part_audit(auditId int identity(1,1) primary key, partId int, price decimal, dateChange datetime default getdate())part after update, delete 上的触发器。在触发器中检查update(price),如果是,则从deleted 插入part_audit。要查找历史价格,请选择感兴趣日期后最近的dateChange

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多