我正在使用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 的范围之外。我不知道,也许这并不重要。
有没有一种可靠的方法来查找和记录所有改变数据库的语句?
RPC:Completed
和SQL:BatchCompleted
事件。一个Textdata过滤器能捕获存储过程内部所做的更改吗?我对此还比较陌生。 - Rick Koshi