在SQLServer里面追寻触发器触发的源头

本文介绍了一种在SQL Server中追踪数据变更的方法,通过使用特定的SQL语句和触发器来记录数据变化的过程,这对于定位错误数据源及责任人非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常,数据库的数据的都是程序发送的指令进行增删改。后台进行日常维护包括备份、索引重建等工作,当然也存在直接执行update语句以修复错误数据的情况,如果这种行为发生在客户身上,并且客户是个二把刀,那么可能会出后果无人承担的情况。那么除了从制度上明确上述行为之外,技术上能否进行一些追踪呢?

 

我们可以通过下面语句获取到当前正在执行的语句:

DECLARE @Handle varbinary(64);
SELECT @Handle = sql_handle 
  FROM master..sysprocesses
 WHERE spid=@@SPID

SELECT * FROM sys.fn_get_sql(@Handle);  
GO

即根据SQLServer全局变量@@spid就可以获取到当前执行的是哪个语句。这与从“活动监视器”里面取进程的批处理命令是一个原理。

回到主题,如果要监控数据变化,我们就得在触发器里面安插自己的监控,从而记录事件发生的时间地点人物,事情的起因经过结果。

那么在触发器里面上面这句是否有效呢,答案是否定的。

 

下面祭出大招:

CREATE TABLE #inputbuffer(
      EventType nvarchar(30), 
      Parameters smallint, 
      EventInfo nvarchar(4000)    
)

insert into #inputbuffer
exec('dbcc INPUTBUFFER( @@SPID )')

关键在于这句,获取触发当前spid的语句,返回三个字段。如果是由存储过程触发的,则返回存储过程名

 

取到原始语句后,我们就可以判断数据变化到底是由那个语句触发,为我们进一步判断罪魁祸首提供依据。

当前了,这种行为都是事后诸葛,而且会损失一部分数据库性能。

如要从根源上有效预防这种情况还是要从制度上去分清楚权利和责任。

转载于:https://www.cnblogs.com/blogzhang/p/6062371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值