如何在SQL Server中获取表的每日快照?

时间:2019-01-15 22:14:22

标签: sql sql-server tsql

其中一个表必须是产品代表及其分配区域的层次结构。 Orese代表及其区域每天都在变化,我需要跟踪该桌子每天的确切状况。我将需要每天对该表进行快照。我想知道我该怎么做或必须如何将数据存储在表中,以便能够准确地知道某个时间点表中的数据是什么。这可能吗?请记住,表的大小不能超过1 MB,并且表具有增量负载。我不想使用任何工具。我只想在存储的proc中为其构建逻辑。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作之一:

  • 每天创建一个新表,并在其中复制表中的数据;
  • 创建具有与表相同结构的一个新表,并添加一个附加的日期列,以存储拍摄快照的日期,然后每天将表与当前系统日期一起复制;
  • 使现有表成为temporal table(注释中的粘滞位也建议)。请注意,您需要使用SQL Server 2016或更高版本。

我的个人喜好是最后一个选择,但前两个可能对您来说更容易。

对于前两个选项,您需要创建一个SQL Server Agent作业以每晚运行并拍摄快照。第三个选项会自动运行。

可以说您的表名为MyTable,具有主键ID int和字段Name varchar(50)

对于第一个选项,您需要使用动态SQL,因为每次新表的名称都会不同:

declare @sql nvarchar(max) = N'select ID, Name into MyTable_' +
    convert(nvarchar(10), getdate(), 112) + N' from MyTable'
exec (@sql)

执行时,此语句将创建一个新表,该表的结构与现有表相同,但以当前日期作为后缀命名,例如MyTable_20190116,然后将MyTable复制到其中。

对于第二个选项,您需要创建一个像波纹管这样的表,并使用如下脚本将数据复制到该表中:

create table MyTableDailySnapshots(
    SnapshotDate date not null
    , ID int not null
    , Name varchar(50)
    , constraint PK_MyTableDailySnapshots primary key clustered (SnapshotDate, ID)
)

insert into MyTableDailySnapshots(SnapshotDate, ID, Name)
select GETDATE(), ID, Name
from MyTable

如果选择第三个选项,则无需采取任何措施来维护快照。只需使用这样的查询,即可获得一段时间的表状态:

select ID, Name from MyTable   
for system_time between '2019-01-16 00:00:00.0000000' and '2019-01-16 23:59:59.9999999'

如果表的架构随时间变化,则第一个选项更加灵活,因为您每天都可以创建具有不同架构的表。选项2和3仅具有1个表来存储快照,因此,如果需要更改表的架构,则可能需要具有创造力。但是第一种选择的缺点是在数据库中创建了大量的表。

因此,由您自行决定最适合您的情况。