読者です 読者をやめる 読者になる 読者になる

SQL Server 2016 Temporal Table の SysStartTime はいつのタイミングの値が入るか確認する

Temporal Tables
の Important のところに、system start time (SysStartTime) は、同一トランザクションのデータは、同じ UTC 時間を持たないとダメと書いてます。

SysStartTime 列は、GENERATED ALWAYS AS ROW START として定義し、自分で値を設定しません。
で、DEFAULT と同じ挙動だと同じ UTC 時間にならないよなーと思い確認してみました。

試した環境は
TechNet Virtual Labs Exploring SQL Server 2016 Temporal Tables
です。*1

これの 1.2, 1.3 を終わらして 既存のテーブル Person.BusinessEntityContract を Temporal Table にしたとこから確認しています。

select cast(GETUTCDATE() as datetime2) as [before tran]

begin tran

select cast(GETUTCDATE() as datetime2) as [start tran]

insert into Person.BusinessEntityContract
(BusinessEntityID, PersonID, ContractTypeID, rowguid, ModifiedDate)
output inserted.BusinessEntityID, inserted.SysStartTime 
values (10008, 1977, 11, NEWID(), getutcdate())

select cast(GETUTCDATE() as datetime2) as [inserted 10008]

waitfor delay '00:00:02'

select cast(GETUTCDATE() as datetime2) as [delay]

insert into Person.BusinessEntityContract
(BusinessEntityID, PersonID, ContractTypeID, rowguid, ModifiedDate)
output inserted.BusinessEntityID, inserted.SysStartTime 
values (10009, 1977, 12, NEWID(), getutcdate())

select cast(GETUTCDATE() as datetime2) as [inserted 10009]

commit

select BusinessEntityID, SysStartTime
from Person.BusinessEntityCotract
where BusinessEntityID in (10008, 10009)

これを見ると、SysStartTime は同じ値になっています。
Transaction の開始時点の時刻を設定するような動きになっているようですね。*2

*1:CTP1 の環境ですが、きっと一緒の動きでしょう

*2:若干変な風にずれてるけど。。