数据表被篡改,如何查找根源。

chenkejun 2016-12-15 05:49:41
发现系统中一个数据表被人恶意添加和修改数据。
请问如何能查找到是局域网内哪台机器,通过何种手段修改的。

现已经在这个数据表上增加了触发器,对插入和更新都做了记录,能查到时什么时间,对那条记录做了修改。
但通过sql profiler抓取不到任何执行更新操作的sql语句。

或许是我监视的事件不对,请问各位有什么好的建议或方法。
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-12-22
  • 打赏
  • 举报
回复
引用 7 楼 chenkejun 的回复:
[quote=引用 5 楼 yupeigu 的回复:] [quote=引用 4 楼 chenkejun 的回复:] [quote=引用 3 楼 OrchidCat 的回复:]
if exists(select 1 from inserted) and exists(select 1 from deleted) 
--判定是更新数据, 再写到你的log表里面就行. 
如果这个是非常关键的表. 建议lz做更加严格的监控. 触发器不是长久之计. (消耗性能)
被更新的数据早已经被定位了,关键是查询对方怎么修改的。[/quote] 你可以参考一下这个: 监控SQL:用触发器来监控是哪些语句、存储过程修改了特定表(4) http://blog.csdn.net/sqlserverdiscovery/article/details/53691633[/quote] 我自己写的触发器已经包含这些功能了。 人已经抓到了,但始终没明白,profiler抓取不到当时的执行记录。[/quote] 应该可以抓取到,但是开了这个工具后,会有一大堆的日志,最好能导入到表里分析,而且比如我运行了某个存储过程,粗看肯定没办法直接判断是不是这个粗出过错修改了代码,的去存储过程去看是不是涉及到了update那个表,所以找起来肯定没有触发器那么方便
chenkejun 2016-12-22
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:
[quote=引用 4 楼 chenkejun 的回复:] [quote=引用 3 楼 OrchidCat 的回复:]
if exists(select 1 from inserted) and exists(select 1 from deleted) 
--判定是更新数据, 再写到你的log表里面就行. 
如果这个是非常关键的表. 建议lz做更加严格的监控. 触发器不是长久之计. (消耗性能)
被更新的数据早已经被定位了,关键是查询对方怎么修改的。[/quote] 你可以参考一下这个: 监控SQL:用触发器来监控是哪些语句、存储过程修改了特定表(4) http://blog.csdn.net/sqlserverdiscovery/article/details/53691633[/quote] 我自己写的触发器已经包含这些功能了。 人已经抓到了,但始终没明白,profiler抓取不到当时的执行记录。
LongRui888 2016-12-16
  • 打赏
  • 举报
回复
实验代码如下,你可以试试;
--1.建表
create table t(id int,v varchar(10));

insert into t values(1,'abc')



--2.存储过程,用来模拟修改t表的数据
create proc proc_t(@id int,@v varchar(10))
as
update t
set v = @v
where id = @id

go



--3。创建日志表
create table tb_log(eventtype nvarchar(14),prama smallint,eventinfo nvarchar(1000),create_time datetime default getdate())
go



--4.触发器,修改数据时可以触发,从而记录下修改的sql
create trigger dbo.trigger_t
on t
after update
as

insert into tb_log(eventtype,prama,eventinfo)
exec('DBCC INPUTBUFFER('+@@spid+')') 
go




--5.模拟修改数据
exec proc_t 1,'123'
go


update t 
set v = 'xxx'
where id = 1 
go



--6.显示监控日志
select * from tb_log
/*
eventtype	prama	eventinfo	create_time
Language Event	0	update t set v = 'xxx'where id = 1 	2016-12-14 10:25:55.820
Language Event	0	exec proc_t 1,'123'	2016-12-14 10:26:05.840
*/
LongRui888 2016-12-16
  • 打赏
  • 举报
回复
引用 4 楼 chenkejun 的回复:
[quote=引用 3 楼 OrchidCat 的回复:]
if exists(select 1 from inserted) and exists(select 1 from deleted) 
--判定是更新数据, 再写到你的log表里面就行. 
如果这个是非常关键的表. 建议lz做更加严格的监控. 触发器不是长久之计. (消耗性能)
被更新的数据早已经被定位了,关键是查询对方怎么修改的。[/quote] 你可以参考一下这个: 监控SQL:用触发器来监控是哪些语句、存储过程修改了特定表(4) http://blog.csdn.net/sqlserverdiscovery/article/details/53691633
chenkejun 2016-12-16
  • 打赏
  • 举报
回复
引用 3 楼 OrchidCat 的回复:
if exists(select 1 from inserted) and exists(select 1 from deleted) 
--判定是更新数据, 再写到你的log表里面就行. 
如果这个是非常关键的表. 建议lz做更加严格的监控. 触发器不是长久之计. (消耗性能)
被更新的数据早已经被定位了,关键是查询对方怎么修改的。
Mr_Nice 2016-12-16
  • 打赏
  • 举报
回复
if exists(select 1 from inserted) and exists(select 1 from deleted) 
--判定是更新数据, 再写到你的log表里面就行. 
如果这个是非常关键的表. 建议lz做更加严格的监控. 触发器不是长久之计. (消耗性能)
chenkejun 2016-12-15
  • 打赏
  • 举报
回复
引用 1 楼 misterliwei 的回复:
触发器中记录IP地址和执行的SQL语句。
具体该怎么操作呢?
misterliwei 2016-12-15
  • 打赏
  • 举报
回复
触发器中记录IP地址和执行的SQL语句。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧