用触发器追踪到底是哪个存储过程删了数据

有朋友用SQL Server开发了很多存储过程,这些存储过程会访问表Students。忽然有天发现表Students的数据少了,想知道是哪个存储过程删了数据。于是他在表Students上创建了Delete触发器。

如何用触发器追踪到底是哪个存储过程删了数据呢?我们用实例来演示下。

一,创建表Students 和数据

create table students(
id integer primary key,
name varchar(20),
age int
); insert into students values(1, 'Flower', 18); insert into students values(2, 'John', 19); insert into students values(3, 'Jeff', 17);

 

二,创建存储过程

create procedure del_student @del_id integer
as
begin
   delete from tosska.dbo.students where id =@del_id;
end;

 

三,创建Delete触发器

    通过dbcc inputbuffer 命令,将触发Delete触发器的程序信息,写入日志表 tosska.dbo.log_students。

create trigger students_delete
on students
after delete
as
declare @info nvarchar(4000);
declare @source table (EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000));
begin
  if object_id(N'tosska.dbo.log_students', N'U') is null
     create table tosska.dbo.log_students(spid int, log_time datetime, application nvarchar(128), info varchar(4000)); 
  insert into @source exec ('dbcc inputbuffer (' + @@spid + ') with no_infomsgs');
  select top 1 @info = EventInfo from @source;
  insert into tosska.dbo.log_students values(@@spid, getdate(), app_name(), @info);
end;

 

四,尝试删除数据

exec dbo.del_student 1;

 

五,查看日志表

 用触发器追踪到底是哪个存储过程删了数据

 

  applicaiton字段记录了客户端程序名字,info字段记录了删除数据的存储过程,看起来很完美。

 

上一篇:SQLServer无法映射sa与数据库的dbo架构


下一篇:查询sql连接数