Skip to main content

Truncate a table in SQL Server and nobody will ever see it....

Today I ran into a very strange problem. I was doing an audit because a client lost 32 billion records in a table and he wanted to know "Who did it!". They did not use auditing because it had a too large impact on performance. The server and instance was not restarted so the DMV's were still available with data. 

I presumed there were two options how the data could have been lost and so quickly:
  1. run a TRUNCATE TABLE. Very fast and and in less than a second your table is unrecoverable empty 
  2. Switch a partition out into a temporary table and just truncate the original table. Yes it happens and the effect is the same: nothing! 
So I ran this query to collect the last queries:

SELECT
t.TEXT QueryName,
s.execution_count AS ExecutionCount,
s.max_elapsed_time AS MaxElapsedTime,
ISNULL(s.total_elapsed_time / s.execution_count, 0) AS AvgElapsedTime,
s.creation_time AS LogCreatedOn
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
WHERE t.TEXT LIKE '%TRUNCATE%'
ORDER BY
s.creation_time  DESC 

GO 

No truncate. Mmm. With partition? No partition. Mmm, very strange. 

So I created a temp table on my server and ran a truncate table command like this:

TRUNCATE TABLE [dbo].[tblToBeTruncated] 

and the query above. No truncate. Than I changed the query in the following: 

TRUNCATE TABLE [dbo].[tblToBeTruncated] 
GO

and again no truncate.Then I changed the query in a format with a ; like this:

TRUNCATE TABLE [dbo].[tblToBeTruncated];

and there was the truncate statement when I ran the query above.

Due to this bug we weren't able to find the bad guy and he got away with it. I hope the Microsoft SQL Server team will correct this ASAP because every query, even it takes a second, should be in the DMV's. 

For the bad guys: you still can get away with a truncate of a table but be aware the SQL Server team is working on it. 

PS: the test was executed on Azure SQL Database. When I tried it SQL Server 2016 the TRUNCATE command never appeared in the list with ; or without ;. Nothing. Same for SQL Server 2012.

Comments