patternsqlModerate
Do temporal tables log changes when there are none?
Viewed 0 times
temporaltablesnonelogarechangeswhenthere
Problem
Unfortunately I don't have ready access to a SQL 2016 instance to test this. If I had a temporal table with the following schema:
and I were to run the following statement:
would it log changes as if I'd actually updated data?
I've had a look around the MSDN article for temporary tables and the one for Modifying Data but I can't find anything there specifying this.
create table blah (
foo int identity(1,1),
baa int
)and I were to run the following statement:
update blah set baa = baawould it log changes as if I'd actually updated data?
I've had a look around the MSDN article for temporary tables and the one for Modifying Data but I can't find anything there specifying this.
Solution
Converting my comment to answer ..
If the value is actually updated, then it will log changes. If you update the same value, new versions for every row will be recorded, but the column values will remain the same.
Below is the working example :
Now check for the data
perform dummy update
Perform onemore dummy update .. there will be rows with same values but different systime - start and end.
You have to have a proper mechanism to clean up history table as that can grow significantly larger if you forget to trim it.
If the value is actually updated, then it will log changes. If you update the same value, new versions for every row will be recorded, but the column values will remain the same.
Below is the working example :
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)Now check for the data
-- check data
SELECT * FROM dbo.blah;
select * from [dbo].[MSSQL_TemporalHistoryFor_629577281]perform dummy update
update blah
set baa = baaPerform onemore dummy update .. there will be rows with same values but different systime - start and end.
You have to have a proper mechanism to clean up history table as that can grow significantly larger if you forget to trim it.
Code Snippets
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)-- check data
SELECT * FROM dbo.blah;
select * from [dbo].[MSSQL_TemporalHistoryFor_629577281]update blah
set baa = baaContext
StackExchange Database Administrators Q#137284, answer score: 10
Revisions (0)
No revisions yet.