可以使用DBCC INPUTBUFFER完全捕获参数化查询吗?

时间:2010-01-12 23:38:14

标签: sql sql-server sql-server-2008 dbcc

在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)

无论如何都要在触发器的上下文中访问参数值吗?

1 个答案:

答案 0 :(得分:0)

为什么要关心参数值?你应该关心的是表中的旧值和新值(在更新的情况下是旧的和新的 - 对于插入,只有新值)。

由于您使用的是SQL Server 2008,因此应该查看新的Auditing feature。有更多详细信息可供使用,与使用触发器相比,性能有了很大提高。

Here is a page,用于描述使用新功能提供的信息。

关于新功能的

Here is a how to page