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

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

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

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

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

就是说知道了连接spid,我们就可以获取到spid当前执行的是哪个语句。这与从“”活动监视器“”里面取进程的命名是一个原理。

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

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

下面祭出大招:

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

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

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

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

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

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

时间: 2024-12-15 07:37:09

在SQLServer里面追寻触发器触发的源头的相关文章

SQLserver数据库之触发器

在SQLserver数据库中触发器中大致分为两种:DDL.DML触发器,即系统触发器与表触发器,系统触发器是对数据库对象进行操作的触发器,表触发器是对表格的增删改时候所进行的触发器.在这里我们就只说表的触发器. 表的触发器也分为两种,分别为:instead of.after(for):分别在表操作之前与表操作之后进行触发.而且两种触发器都有三个触发条件:insert.delete.update.基本语法为: create trigger tgr_name on table_name with e

SqlServer 中的触发器

SqlServer 触发器实现多表之间同步增加.删除与更新 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 触发器的使用模版如下 CREATE TRIGGER 触发器名称 ON 表名称 AFTER INSERT /UPDATE/DELETE AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字

sqlserver分布式 用触发器插入数据

这个月总公司收购了一家小公司,这家小公司的数据库用的是32位的 Sql2000 ,已经使用很长一段时间了,系统也比较稳定.本着节约成本的原则,总公司保留原公司的一套管理系统,但要求重要数据每天上传到总公司的64位 Sql2005 数据库中去,这个简单的工作自然是交给我高升这样的小人物去完成了. 原想这是个很简单的差事,可是当我建好 LinkServer 以后却报出了如下错误,从此我的噩梦开始了: OLE DB provider "SQLNCLI" for linked server &

触发器触发-同步电路和异步电路异处

前几天写verilog的时候遇到这个问题,以前没有注意到这个问题,真是不应该! 举例: 贴一段很简单的代码 module async(clk,rst_n,out); input clk,rst_n; output[7:0] out; reg[7:0] out; //async always @(posedge clk or negedge rst_n) begin if(!rst_n) out <= 8'h00; else out <= out + 1'b1; end //sync //alw

sqlserver暂时禁用触发器进行update

1 --1.禁用某个表上的所有触发器 2 ALTER TABLE tbname DISABLE TRIGGER all 3 go 4 --2.执行update语句 5 update tbname set .... 6 go 7 --3.恢复某个表上的所有触发器 8 ALTER TABLE tbname ENABLE TRIGGER all 9 go 触发器定义:就是给前期设计擦屁股的东西. 前期设计乱吃东西吃坏肚子了,然后又舍不得动手术,放任拉肚子,拉完之后,拿出触发器把屁股一擦,干净了.

SqlServer禁用启用触发器、外键约束

--禁用指定名称触发器 ALTER TABLE tbname DISABLE TRIGGER trigname --恢复指定名称触发器 ALTER TABLE tbname ENABLE TRIGGER trigname --禁用某个表上的所有触发器 ALTER TABLE tbname DISABLE TRIGGER all --启用某个表上的所有触发器 ALTER TABLE tbname ENABLE TRIGGER all --禁用所有表上的所有触发器exec sp_msforeacht

sqlserver 实现数据变动触发信息

1.建立存储过程,功能是动态写入文件中信息,可以在触发器或存储过程调用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create proc [dbo].[SP_SendMagToFile] ( @path varchar(100), @fileName varchar(100), @msg varchar(200) ) as begin DECLARE @object int DECLARE @hr int DECLARE @src var

SQLServer之删除触发器

删除触发器 注意事项 可以通过删除DML触发器或删除触发器表来删除DML触发器. 删除表时,将同时删除与表关联的所有触发器. 删除触发器时,会从 sys.objects.sys.triggers 和 sys.sql_modules 目录视图中删除有关该触发器的信息. 仅当所有触发器均使用相同的 ON 子句创建时,才能使用一个 DROP TRIGGER 语句删除多个 DDL 触发器. 若要重命名触发器,可使用 DROP TRIGGER 和 CREATE TRIGGER. 若要更改触发器的定义,可使

在SQLServer使用触发器实现数据完整性

1.实现数据完整性的手段 在sqlserver中,在服务器端实现数据完整性主要有两种手段:一种是在创建表时定义数据完整性,主要分为:实体完整性.域完整性.和级联参照完整性:实现的手段是创建主键约束.唯一键约束.检查约束.默认值约束和各种级联完整性约束.另一种是通过编写触发器语句来实现,通过定义触发条件和编写触发后执行语句,来实现对数据表操作的各种约束. 2.触发器的概念 触发器是一种特殊的存储过程.通常用于实现强制业务规则和数据完整性.触发器是通过事件触发而由系统自动执行.主要体现在它在插入.删