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

how to trace SQL table drop create events

我有一些神秘的问题,每天都会用旧数据重新创建(我想删除和创建)DB(SQL Server 2016)中的一个 table。我检查了各种选项以试图找到正在执行此操作的进程,但是无法执行此操作。

Scheduled Tasks - nothing
SQL Agent Jobs - nothing

如何追踪 user/application/anythingelse 正在做什么?

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

创建数据库触发器并记录 create/drop table 事件:

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;