What are Temporal Tables in SQL Server and Azure SQL Database?
Temporal tables keep a full history of data changes (based on UTC time) by using a pair of current-historical tables. These tables has the same structure.
The period of validity for every row is managed by the system (i.e. Database Engine) by using two explicitly-defined columns of the DateTime2 datatype.
Example with Temporal Tables (T-SQL)
Below you can find an example of a user table’s definition that has system versioning enabled:
--Create table along with specifying its historical table
CREATE TABLE dbo.Students2
(
studentID INT NOT NULL IDENTITY(1,1) CONSTRAINT PK_Students PRIMARY KEY,
studentName VARCHAR(150) NOT NULL,
studentAddress VARCHAR(150) NOT NULL,
regDate DATE NOT NULL,
SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Students2History));
GO
The above DDL will create two tables: (i) Students2, and (ii) Students2History.
In the “dbo.Students2” table, the user needs to populate only the first 4 columns (studentID, studentName, studentAddress and regDate). Note: In this case “studentID” will be populated automatically too because it is an identity column. The rest of the columns will be maintained automatically by SQL Server’s Database Engine. Table “dbo.Students2History” will be populated fully automatically by the Database Engine.
In the below screenshot we can see both tables:
Figure 1: Pair of Current-Historical Table.
Learn essential SQL Server development tips! Enroll to our Online Course!
Sharpen your SQL Server database programming skills via a large set of tips on T-SQL and database development techniques. The course, among other, features over than 30 live demonstrations!
(Lifetime Access, Q&A, Certificate of Completion, downloadable resources and more!)
Now, let’s insert some data in the “dbo.Students2” table:
--Insert initial data
INSERT INTO dbo.Students2
( studentName ,
studentAddress ,
regDate
)
VALUES ( 'John Adams',
'Address 1',
GETDATE()
);
GO
Let’s check again both tables for any contents:
Figure 3: Table Contents After Insert.
As you can see, the “dbo.Students2” table was populated with data.
The “dbo.Students2History” table was not populated with any data because system versioning works only in case of an update operation against one or more rows.
That being said, let’s try to update the row:
--Now let's update a record
UPDATE dbo.Students2
SET studentAddress='Address 1 Update'
WHERE studentID=1;
GO
Let’s check again the table contents:
Figure 4: Table Contents After Update Operation.
Now you can see that the table “Students2History” contains the original values for row with studentID=1 just before the update operation took place.
Let’s update the same record again:
--Update the same record
UPDATE dbo.Students2
SET studentAddress='Address 1 Update 2'
WHERE studentID=1;
GO
Let’s check the table contents:
Figure 5: Table Contents After Second Update.
As you can see, the table “Students2History” contains also the “new” original value for row with studentID=1 just before the new update operation took place. So in total, the historical table contains the rows for studentID=1 just before the two update operations took place. The validity of each row can be determined from the “SysStartTime” and “SysEndTime” values.
Conclusion
This article was a simple example of using temporal tables in SQL Server 2016. I consider temporal tables one of the top new features in SQL Server 2016 as they have to offer significant functionality.
Some benefits of using temporal tables:
Auditing all data changes (i.e. for data forensics)
Did you find this article useful and interesting? Feel free to leave your comment!
If you enjoy my SQL Server administration tips and articles, I have something special just for you. It is one of my eBooksand it is called “Administering SQL Server“. Check it out!
Subscribe to our newsletterand stay up to date with our latest articles on SQL Server and related technologies!
Check out our latest software releases! All our software tools have free trial versions to download.
Rate this article: (3 votes, average: 5.00 out of 5)
Artemakis Artemiou is a seasoned Senior Database and AI/Automation Architect with over 20 years of expertise in the IT industry. As a Certified Database, Cloud, and AI professional, he has been recognized as a thought leader, earning the prestigious Microsoft Data Platform MVP title for nine consecutive years (2009-2018). Driven by a passion for simplifying complex topics, Artemakis shares his expertise through articles, online courses, and speaking engagements. He empowers professionals around the globe to excel in Databases, Cloud, AI, Automation, and Software Development. Committed to innovation and education, Artemakis strives to make technology accessible and impactful for everyone.
Views:3,824
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept All”, you consent to the use of ALL the cookies. However, you may visit "Cookie Settings" to provide a controlled consent. Read More
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.