如何跟踪SQL表删除创建事件

问题描述

我有一个神秘的问题,每天都在用旧数据重新创建DB(sql Server 2016)中的一个表(我想删除并创建)。我检查了各种选项以尝试找到执行此操作的进程,但是无法做到这一点。

Scheduled Tasks - nothing
sql Agent Jobs - nothing

如何跟踪正在执行此操作的用户/应用程序/其他任何东西?

我尝试启动sql Profiler并开始手动跟踪,但是过了一段时间(半天左右),它才停止。

解决方法

创建数据库触发器并记录创建/删除表事件:

create table dbo.traceTabledropcreate(EventDataXML xml,LogDatetime datetime default(getdate()));
go
 
create or alter trigger dbtrigger_traceTabledropcreate 
on database
with execute as 'dbo'  
for CREATE_TABLE,DROP_TABLE
as
begin
    set nocount on;
    --insert into dbo.traceTabledropcreate(EventDataXML)
    --values (EVENTDATA());

    declare @sessionxml xml = 
    (
        select EVENTDATA(),(
        select *
        from sys.dm_exec_sessions
        where session_id = @@spid
        for xml path('sessioninfo'),type
        )
       for xml path('')
    );

    insert into dbo.traceTabledropcreate(EventDataXML)
    values (@sessionxml);

end
go

---..... and wait....

--..test
create table dbo.testtable(id int)
go
select *
from dbo.traceTabledropcreate
go

drop table dbo.testtable
go
select *
from dbo.traceTabledropcreate
go
,

默认跟踪捕获架构更改。查看“架构更改历史记录”报告或运行以下查询以在T-SQL中检索信息。请注意,默认跟踪翻转文件限制为5个文件,每个文件最大20MB,因此较旧的事件可能已经开始。

--select object created and deleted information from default trace
SELECT 
      trace_table.StartTime,te.name,trace_table.ObjectName,trace_table.ApplicationName,trace_table.LoginName
FROM (
    SELECT REVERSE(SUBSTRING(REVERSE(path),CHARINDEX('\',REVERSE(path)),255)) + 'log.trc'
    FROM sys.traces
    WHERE
        is_default = 1
    ) AS trace(path)
CROSS APPLY sys.fn_trace_gettable(trace.path,DEFAULT) AS trace_table
JOIN sys.trace_events AS te ON
    te.trace_event_id = trace_table.EventClass
WHERE 
    EventSubClass = 0
    AND name IN('Object:Created','Object:Deleted')
ORDER BY StartTime;