如何在SQL Server中追踪数据库写入?

5

我正在使用SQL Server 2008 R2,尝试对一个不透明的应用程序进行反向工程,并复制其中一些操作,以便我可以自动化一些大规模的数据加载。

我认为这应该很容易做到 - 只需进入SQL Server Profiler,开始跟踪,执行GUI操作,然后查看跟踪结果。我的问题是过滤器没有按照我预期的方式工作。特别是,“写入”列经常显示“0”,即使是明显对数据库进行更改的语句,如INSERT查询。这使得我无法设置Writes >= 1过滤器,就像我想要的那样。

我已经通过设置全包括的跟踪并运行应用程序来验证了这正是发生的情况。我在运行操作之前检查了表格,在运行操作之后再次检查了表格,它确实对表格进行了更改。我查看了跟踪,没有一行显示“写入”列中的任何非零数字,包括显示INSERT查询的行。查询没有什么特别之处... 就像这样:

exec sp_executesql 
    N'INSERT INTO my_table([a], [b], [c]) 
      values(@newA, @newB, @newC)',
    N'@newA int,@newB int,@newC int', @newA=1, @newB=2, @newC=3

如果上述内容有错误,那是我在这里打错了——该语句肯定是在向表中插入记录。
我相信这种行为的关键在于“写入”列的描述:“服务器代表事件执行的物理磁盘写入次数”。也许服务器正在缓存写入,并且它发生在 Profiler 的范围之外。我不知道,也许这并不重要。
有没有一种可靠的方法来查找和记录所有改变数据库的语句?

2
你确定你的跟踪配置正确吗?你是在看起始调用而不是完成调用吗?你看不到开始的东西,因为它还没有发生。 - Eric J. Price
你正在过滤哪些事件?在 Textdata 上进行通配符搜索,以过滤包含 Insert、Update 和 Delete 的文本数据,这样行得通吗?但正如 @Love2Learn 所说,你应该确保跟踪 RPC 完成和 SQL 批处理完成,而不是开始。 - user806549
我正在使用“标准(默认)”模板,其中包括RPC:CompletedSQL:BatchCompleted事件。一个Textdata过滤器能捕获存储过程内部所做的更改吗?我对此还比较陌生。 - Rick Koshi
我得出了结论在这里,Profiler Writes列实际上显示了脏页数。如果您写入的页面已经是脏的,则报告0个写操作。 - Martin Smith
1个回答

1

你尝试过服务器端跟踪吗?它也可用于记录读取和写入操作,如果我理解正确的话,你想要记录写入操作。


这将会报告与 Profiler 完全相同的内容。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接