I have been working my way through a fantastic training on SQL Internals and when I saw this trick, I had to write it down so I wouldn’t forget it.
Say you have a user come to you and they dropped a table sometime yesterday, but they don’t remember when and now they need it back. You could start the restore process and roll through logs until you see the drop and then restore to the hour before or you could run this super cool query to get the time the table was dropped.
(Before I ran this, I set up a test database, created a table, filled it with stuff, took a full backup and a transaction log backup, dropped the table and then took another transaction log backup)
SELECT [Current LSN] ,[Operation] ,[Context] ,[Transaction ID] ,[Description] ,[Begin Time] ,[Transaction SID] FROM fn_dblog (NULL,NULL) INNER JOIN(SELECT [Transaction ID] AS tid FROM fn_dblog(NULL,NULL) WHERE [Transaction Name] LIKE 'DROPOBJ%')fd ON [Transaction ID] = fd.tid
See that Begin Time? We want to roll our logs forward to right before that started. How cool is that?!!! Nearest point in time recovery that is possible all because of reading through the log to see when the drop occurred.
But this next part was the piece that blew my mind. What if I didn’t know who dropped the table, but wanted to talk to them so they didn’t do it again? I can add one more column to my query.
SELECT [Current LSN] ,[Operation] ,[Context] ,[Transaction ID] ,[Description] ,[Begin Time] ,[Transaction SID] ,SUSER_SNAME ([Transaction SID]) AS WhoDidIt FROM fn_dblog (NULL,NULL) INNER JOIN(SELECT [Transaction ID] AS tid FROM fn_dblog(NULL,NULL) WHERE [Transaction Name] LIKE 'DROPOBJ%')fd ON [Transaction ID] = fd.tid
I am passing that Transaction SID into the SUSER_SNAME built in function.
Probably shouldn’t be surprised by that answer.
The song for this post is Left and Right by Charlie Puth.
Strange, on Azure SQL Database it returns “‘SUSER_SNAME’ cannot be invoked with parameters in this version of SQL Server.” But SUSER_SNAME it looks like it’s supported: https://learn.microsoft.com/en-us/sql/t-sql/functions/suser-sname-transact-sql?view=sql-server-ver16
That’s a really good point. I don’t have access to my log on Azure SQL Database so I get an error. I thought it was just my permissions were too low.
Here is the answer: https://dba.stackexchange.com/questions/319047/suser-sname-cannot-be-invoked-with-parameters-in-this-version-of-sql-server
Awesome job! Thank you so much for finding and sharing the answer!