SQL Server保存表的当前状态以进行报告[关闭]

问题描述 投票:1回答:1

我们目前有一个报表,用于管理每个销售人员的销售额,该销售人员组合了所有类型的销售(下面的ReportTable示例)。此报告表经常由后端流程填充,以跟踪销售人员的总销售额。

我们现在面临的问题是,销售人员希望能够在某个日期“冻结”他们的报告,以确保他们拥有所有销售的库存,然后在他们赶上时“解冻”。这意味着当报告被冻结时,我们需要一种方法来捕获销售人员销售的当前状态,以便我们可以根据这些数字提供不同的报告。

不幸的是,我们仍然需要报告表是最新的,因为销售人员仍需要查看更新收入以确保客户付费(因为我们有在线和离线销售)。

ReportTable

int SalesPersonId,
int SaleType,
decimal SaleTotal,
decimal PaymentsOwed,
int CustomerId,
int OrderRegion

桌面上的两个想法似乎都不是最好的做法:

  1. 在冻结报告时,将每个销售人员的数据复制到报告表中,然后只查询复制表。这里的一个缺点是,一个完整的重复数据表,我不知道将表复制到完全相同类型的另一个表需要多长时间。
  2. 每次修改此报告表时创建一个新行,以跟踪销售人员冻结其报告之前/之后修改的行。这将增加报告查询以及每次销售时网站的复杂性。

有没有人建议在这里采用更好的方法或者使用上述2个建议中的任何一个?

sql-server database
1个回答
0
投票

这是Temporal Table用例的完美示例。

系统版本的时态表是一种用户表,旨在保持数据更改的完整历史记录,并允许简单的时间点分析。这种类型的时态表被称为系统版本的时间表,因为每行的有效期由系统(即数据库引擎)管理。

创建时态表时,系统会创建两个对象(嗯,两个直接相关);基表和相应的历史表。插入,更新和删除在基表上生效,相应的“之前”图像存储在历史表中。您可以针对包含AS OF <datetime>子句的表编写查询,以查看某个时间点的数据。

SQL Server版本2016及更高版本中提供了时态表。

编辑:为了避免长时间保留历史记录(我们大多数人不想要或不需要),有许多选项可用于修剪历史记录表。微软向Manage Retention of Historical Data in System-Versioned Temporal Tables提出了一些建议,这些建议以Azure的销售推广为主导,但在此之后变得更有趣,并且Aaron Bertrand在这个MSSqlTips article中将粒度维护提升到了一个全新的水平。

没有停机时间的维护更难设置,但所有方法都可以自动化以“设置并忘记”简单。

© www.soinside.com 2019 - 2024. All rights reserved.