问题描述
我有一个神秘的问题,每天都在用旧数据重新创建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;