Monday, July 1, 2019

How to find deleted object detail in SQL server default trace

How to find the deleted object detail in SQL server default trace

This SQL query helps identify deleted objects in SQL Server using T-SQL. It reads from the default trace and presents the relevant details.

;WITH cteObjectTypes
AS (
 SELECT TSV.trace_event_id
  ,TSV.subclass_name
  ,TSV.subclass_value
 FROM sys.trace_subclass_values AS TSV
 JOIN sys.trace_columns AS TC ON TSV.trace_column_id = TC.trace_column_id
 WHERE TC.[name] = 'ObjectType'
 )
 ,cteEventSubClasses
AS (
 SELECT TSV.trace_event_id
  ,TSV.subclass_name
  ,TSV.subclass_value
 FROM sys.trace_subclass_values AS TSV
 JOIN sys.trace_columns AS TC ON TSV.trace_column_id = TC.trace_column_id
 WHERE TC.[name] = 'EventSubClass'
 )
SELECT TE.[name]
 ,I.ApplicationName
 ,I.BigintData1
 ,I.ClientProcessID
 ,I.ColumnPermissions
 ,I.DatabaseID
 ,I.DatabaseName
 ,I.DBUserName
 ,I.Duration
 ,I.EndTime
 ,I.Error
 ,I.EventSequence
 ,Convert(NVARCHAR(10), I.EventSubClass) + N'-' + ESC.subclass_name AS EventSubClass
 ,I.FileName
 ,I.HostName
 ,I.IndexID
 ,I.IntegerData
 ,I.IsSystem
 ,I.LineNumber
 ,I.LoginName
 ,I.LoginSid
 ,I.NestLevel
 ,I.NTDomainName
 ,I.NTUserName
 ,I.ObjectID
 ,I.ObjectID2
 ,I.ObjectName
 ,Convert(NVARCHAR(10), I.ObjectType) + N'-' + OT.subclass_name AS ObjectType
 ,I.OwnerName
 ,I.ParentName
 ,I.Permissions
 ,I.RequestID
 ,I.RoleName
 ,I.ServerName
 ,I.SessionLoginName
 ,I.Severity
 ,I.SPID
 ,I.StartTime
 ,I.STATE
 ,I.Success
 ,I.TargetLoginName
 ,I.TargetLoginSid
 ,I.TargetUserName
 ,I.TextData
 ,I.TransactionID
 ,I.Type
 ,I.XactSequence
FROM sys.traces T
CROSS APPLY sys.fn_trace_gettable(CASE 
   WHEN CHARINDEX('_', T.[path]) <> 0
    THEN SUBSTRING(T.PATH, 1, CHARINDEX('_', T.[path]) - 1) + '.trc'
   ELSE T.[path]
   END, T.max_files) I
JOIN sys.trace_events AS TE ON I.EventClass = TE.trace_event_id
LEFT JOIN cteEventSubClasses AS ESC ON TE.trace_event_id = ESC.trace_event_id
 AND I.EventSubClass = ESC.subclass_value
LEFT JOIN cteObjectTypes AS OT ON TE.trace_event_id = OT.trace_event_id
 AND I.ObjectType = OT.subclass_value
WHERE T.is_default = 1
 AND TE.NAME = 'Object:Deleted'

Popular Posts