在SQL Server 2008中,我使用触发器捕获对数据库中特定表所做的所有更改。我的目标是捕捉整个变化。也就是说,捕获正在插入的数据,而不仅仅是插入数据。在触发器中,我使用DBCC INPUTBUFFER返回的结果集的EventInfo列来获取当前正在执行的SQL语句以及Parameters列以获取所用参数的计数。这在大多数情况下都有效,但是当外部应用程序使用ADO.NET执行查询,或者使用SSMS中的编辑前200行插入/删除行时,EventInfo没有参数值。
例如,如果字符串查询在查询窗口中执行或在ADO.NET中作为非参数化字符串查询执行,则EventInfo显示:
INSERT INTO DTS_TABLE ([ID] ,[DTS_ID] ,[DTS] ,[TICS]) VALUES (10, 9, GETDATE(), 91234)
在ADO.NET中使用Edit Top 200 Rows或参数化查询插入相同的数据时,会显示EventInfo(为了便于阅读而添加新行):
(@id int,@dtsid int,@dts datetime,@tics int)
INSERT INTO DTS_TABLE ([ID] ,[DTS_ID] ,[DTS] ,[TICS])
VALUES (@id, @dtsid, @dts, @tics)
无论如何都要在触发器的上下文中访问参数值吗?
答案 0 :(得分:0)
为什么要关心参数值?你应该关心的是表中的旧值和新值(在更新的情况下是旧的和新的 - 对于插入,只有新值)。
由于您使用的是SQL Server 2008,因此应该查看新的Auditing feature。有更多详细信息可供使用,与使用触发器相比,性能有了很大提高。
Here is a page,用于描述使用新功能提供的信息。
关于新功能的