2006-12-06

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

来源: 本站收集整理 作者:佚名 评论 0 条
 

(图1)

既然我们已经有办法写入事件日志了,那么让我们修改一下触发器,将数据写到一个文本文件中。这次改动还须添加另一个变量@CmdString,以及使用扩展储存过程xp_cmdshell。

因为我们要写入文件系统,安全权限开始有影响了。所以,执行插入操作的用户必须具备该文本文件的读写权限。因此,设计一个C/S结构的应用程序供多用户运行,或许不是一个可行的解决方案。更合理的方案是,设计一个三层应用程序,由你的中间层组件对单用户数据库进行调用。在后一个方案中,对那个文本文件的权限治理其实比治理一个用户还轻易。

Alter trigger TestTrigger on 

tablefortrigger 

for insert 

as 

Declare @Msg varchar(1000) 

--储存将由xp_cmdshell执行的命令

Declare @CmdString varchar (2000) 

set @_msg = ' insert | tablefortrigger | '   convert 

( varchar ( 20 ) , getdate ( ) )   ' | '   

( select convert ( varchar ( 5 ) , track )   ' , ' 

  lastname   ' , '   firstname from insert ) - 

[99%]set @Msg = 'Inserted | tablefortrigger | ' 

  convert(varchar(20), getdate())   ' | '  

(select convert(varchar(5), track)   ', '   lastname   ', ' 

  firstname from inserted) 

--产生错误发送给事件查看器。

raiserror( 50005, 10, 1, @Msg) 

set @CmdString = 'echo '   @Msg   ' >> C:logtest.log' 

--写到文本文件

exec master.dbo.xp_cmdshell @CmdString

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

  

Insert into tablefortrigger(lastname, firstname) 

Values('Doe', 'John')

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

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


(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:史上最NB程序员的自白(笑)  
下一篇:戒浮戒躁!一个“假程序员”的心里话
    评论加载中…
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
共3页: 上一页 [1] 2 [3] 下一页
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号