如何跟踪 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;
我有一些神秘的问题,每天都会用旧数据重新创建(我想删除和创建)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;