Jef*_*eff 9 sql-server temporal-tables sql-server-2016
不幸的是,我没有准备好访问 SQL 2016 实例来测试这个。如果我有一个具有以下架构的时态表:
create table blah (
foo int identity(1,1),
baa int
)
Run Code Online (Sandbox Code Playgroud)
我要运行以下语句:
update blah set baa = baa
Run Code Online (Sandbox Code Playgroud)
它会像我实际更新数据一样记录更改吗?
我已经查看了MSDN 文章中的临时表和修改数据的文章,但在那里找不到任何指定此内容的内容。
Kin*_*hah 10
将我的评论转换为回答..
如果该值实际更新,则它将记录更改。如果您更新相同的值,将记录每一行的新版本,但列值将保持不变。
以下是工作示例:
CREATE TABLE dbo.blah1
-- PK is a requirement !!
(
foo INT identity(1, 1) PRIMARY KEY
,baa INT
,SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
,SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
,PERIOD FOR SYSTEM_TIME(SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON);
-- insert data
insert into dbo.blah (baa)
values (1)
Run Code Online (Sandbox Code Playgroud)
现在检查数据
-- check data
SELECT * FROM dbo.blah;
select * from [dbo].[MSSQL_TemporalHistoryFor_629577281]
Run Code Online (Sandbox Code Playgroud)
执行虚拟更新
update blah
set baa = baa
Run Code Online (Sandbox Code Playgroud)
执行一次虚拟更新......会有具有相同值但不同系统时间的行 - 开始和结束。
你必须有一个适当的机制来清理历史表,因为如果你忘记修剪它,它会变得更大。