SQL Server保存表的当前状态以进行报告

时间:2019-02-22 17:59:38

标签: sql-server database

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

我们现在面临的问题是,销售人员希望能够在某个日期“冻结”他们的报表,以确保他们拥有所有销售的库存,然后在遇到问题时“冻结”。这意味着在冻结报表时,我们需要一种捕获销售人员销售状况的方法,以便我们可以基于这些数字提供不同的报表。

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

ReportTable

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

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

  1. 在冻结报表时仅将每个销售员的数据复制到报表中,然后查询副本表即可。这里的一个缺点是,一张完整的重复数据表,而且我不确定将一个表复制到另一个完全相同类型的表中需要花费多长时间。

  2. 每次修改此报告表时,
  3. 创建一个新行,以跟踪销售员冻结其报告之前/之后修改的行。每当销售时,这都会增加报告查询以及网站的复杂性。

有人在这里提出了一种更好的方法的建议吗,还是已经采用了以上两个建议中的任何一个?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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

编辑:为了避免一直保留历史记录,这是我们大多数人都不想要或不需要的,有许多选项可用于整理历史记录表。微软对Manage Retention of Historical Data in System-Versioned Temporal Tables提出了许多建议,这些建议导致了Azure的销售,但之后变得更加有趣,Aaron Bertrand在此MSSqlTips article中将粒度维护提升到了一个全新的水平。

难以设置没有停机时间的维护,但是所有方法都可以自动实现“设置并忘记它”的简便性。