| (图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') |
问题解决了,对不对?哦,还没完全解决。发生多次重复插入的事件是什么原因?在这个例子中,你必须分别地处理每条记录。为了达到这个目的,我们必须用一个会带来麻烦的游标来访问"隐蔽面"。在执行以前,我必须预先给予警告。你应当了解的是,当这个应用程序进行大规模地记录插入、更新或删除时要当心,因为它可能会耗费大量的内存。 像你从下面看到的一样,这次我们在前面那个例子的基础上稍加调整,引入了一个游标,对该插入表的全部记录进行循环读取。每条记录分别插入一条线条,将各个事件区分开来。 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] 下一页 |
评论加载中…
|