快速业务通道

用触发器生成数据库表的数据操作日志

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

--写到文本文件

exec master.dbo.xp_cmdshell @CmdString

让我们对它进行测试,先运行前面的插入语句,然后打开C:\logtest.log文件查看结果:

Insert into tablefortrigger(lastname, firstname) Values(''Doe'', ''John'')

问题解决了,对不对?哦,还没完全解决。发生多次重复插入的事件是什么原因?在这个例子中,你必须分别地处理每条记录。为了达到这个目的,我们必须用一个会带来麻烦的游标来访问"隐蔽面"。在执行以前,我必须预先给予警告。你应当了解的是,当这个应用程序进行大规模地记录插入、更新或删除时要当心,因为它可能会耗费大量的内存。

像你从下面看到的一样,这次我们在前面那个例子的基础上稍加调整,引入了一个游标,对该插入表的全部记录进行循环读取。每条记录分别插入一条线条,将各个事件区分开来。

ALTER trigger TestTrigger on tablefortrigger
for insert
as
Declare @Msg varchar(1000)
Declare @CmdString varchar (1000)
Declare GetinsertedCursor cursor for
Select ''Inserted | tablefortrigger | '' + convert(varchar(20), getdate()) + '' | ''
+ convert(varchar(5), track)
+ '', '' + lastname + '', '' + firstname
from inserted
open GetinsertedCursor
Fetch Next from GetinsertedCursor
into @Msg
while @@fetch_status = 0
Begin
 raiserror( 50005, 10, 1, @Msg)
 Fetch Next from GetinsertedCursor
 into @Msg
 set @CmdString = ''echo '' + @Msg + '' >> C:\logtest.log''
 exec master.dbo.xp_cmdshell @CmdString
End
close Getinsertedcursor
deallocate GetInsertedCursor

现在让我们执行重复多次插入测试:

Insert into tablefortrigger(lastname, firstname)
Select lastname, firstname from employees

结论

在继续完成之前,有些人认为必须考虑性能与安全问题。你将看到写入文本文件的开销,而对于一个每分钟处理5000项事务的数据库来说,这样大的开销也许不可接受。由于xp_cmdshell是在SQL外操作的,写入到文件的错误不会回滚事务。倘若入侵者使用一个隐蔽的途径来改变你的数据,这个事件不会被登记到那个文本文件中。不过事件日志将记录该次DML改动。作为一次最好的实践,各事件的编号应该被用于对照日志文件的各行记录,以便发现所有的差异。

有很多种方法可以达到本文目标,上述脚本也可以有许多的变化。我希望你能接受这个脚本,然后作出改进并提出建议,使它更有效率。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号