A system versioned temporal table keeps full history of
changes and allows point in time analysis. 
For such tables SQL Server creates & maintains
a history table. When a row is modified or deleted, it is time stamped & moved
automatically to history table first.
Creating Temporal
Table
CREATE TABLE
dbo.Customer
(
-- Primary Key is
Required for Temporal Tables.
ID int
NOT NULL PRIMARY KEY CLUSTERED, 
Name varchar(50) NOT NULL,
MaritalStatus varchar(20),
-- Define Period
Columns
StartEffectiveDate datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
EndEffectiveDate datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
-- Designate Period
Columns
PERIOD FOR
SYSTEM_TIME (StartEffectiveDate
,EndEffectiveDate)
)
WITH
(SYSTEM_VERSIONING =
ON -- Mark table as
System Versioned.
    (HISTORY_TABLE = dbo.Customer_History) -- Name of History Table.
);
GO
-- Insert Data into
temporal table.
INSERT INTO
dbo.Customer values ( 1,'John', 'Single'), (2,'Jack', 'Married')
-- Query Temporal
Table
select *
from dbo.Customer
| 
ID | 
Name | 
MaritalStatus | 
| 
1 | 
John | 
Single | 
| 
2 | 
Jack | 
Married | 
-- Query History Table
select *
from dbo.Customer_History
(0 row(s) affected)
Updating Data
update dbo.Customer
Set MaritalStatus = 'Married' where ID = 1
-- Query Actual Table
select *
from dbo.Customer
| 
ID | 
Name | 
MaritalStatus | 
| 
1 | 
John | 
Married | 
| 
2 | 
Jack | 
Married | 
-- Query History Table
(Times are in UTC)
select *
from dbo.Customer_History
| 
ID | 
Name | 
MaritalStatus | 
StartEffectiveDate | 
EndEffectiveDate | 
| 
1 | 
John | 
Single | 
11/9/2015  9:09:56 PM | 
11/9/2015  9:11:54 PM | 
Deleting Data
delete from
dbo.Customer where
ID = 2
-- Query Temporal
Table
select *
from dbo.Customer
| 
ID | 
Name | 
MaritalStatus | 
| 
1 | 
John | 
Married | 
-- Query History Table
select *
from dbo.Customer_History
| 
ID | 
Name | 
MaritalStatus | 
StartEffectiveDate | 
EndEffectiveDate | 
| 
1 | 
John | 
Single | 
11/9/2015  9:09:56 PM | 
11/9/2015  9:11:54 PM | 
| 
2 | 
Jack | 
Married | 
11/9/2015  9:09:56 PM | 
11/9/2015  9:14:54 PM | 
Point in Time
Analysis
SQL Server introduced special clauses to allow querying for point
in time analysis.
FOR SYSTEM_TIME AS OF <DateTime2>  gives state of table as of the specified
time. (Excluding the boundary value)
select *
from dbo.Customer
FOR SYSTEM_TIME
AS OF '2015-11-09 20:52:00'
| 
ID | 
Name | 
MaritalStatus | 
| 
1 | 
John | 
Single | 
| 
2 | 
Jack | 
Married | 
Dropping Temporal
Table 
ALTER TABLE
[dbo].[Customer] SET ( SYSTEM_VERSIONING = OFF )
DROP Table
dbo.Customer
DROP TABLE
dbo.Customer_History 
 
No comments:
Post a Comment