我使用 DbVisualizer 8.0.12 作为 MS SQL Server 2012 数据库的客户端工具。
我想执行简单的更新:
update table1 set field1=0 where filed2='something';
我希望恰好更新一行,因为 field2 是 table1 的主键。
另外,做一个:
select * from table1 where field2='something';
正好返回一行。
但是在执行更新 sql 时,DBVisualizer 通知我成功执行了两次更新。
11:16:58 [UPDATE - 1 row(s), 0.003 secs] Command processed
11:16:58 [UPDATE - 1 row(s), 0.003 secs] Command processed
... 2 statement(s) executed, 2 row(s) affected, exec/fetch time: 0.006/0.000 sec [2 successful, 0 warnings, 0 errors]
我不明白为什么要执行两次更新?不应该只有一个更新吗?
有人可以请教吗?预先感谢您提供任何信息。
[编辑]
正如@TomTom 建议的那样,我使用了 MS SQL Server 分析器。
我还使用 Microsoft SQL Server Management Studio 运行了我的 SQL 更新。
我必须为探查器(以及我的需要)打开的东西是:
1.'跟踪属性>事件选择>列过滤器>数据库名称 - 像:my_db_name',因为我们在服务器上有很多数据库,所以在为了只跟踪名为“my_db_name”的数据库
2.“跟踪属性 > 事件选择 > 存储过程 > 启用 SP:StmtStarting 和 SP:StmtCompleted”,因为我想启用触发器跟踪
似乎来自 DBVisualizer 的此信息消息具有误导性(这只发生在具有触发器的表中——在这种特殊情况下,触发器在每次更新时将数据插入另一个表(所谓的存档表))。实际上,只完成了一次更新,所以一切都很好。
Microsoft SQL Server Management Studio 显示正确信息:1 次更新和 1 次插入。
希望这会帮助有类似“问题”的人。@TomTom 请将您的评论作为答案,这样我就可以给您好评。谢谢你。
不过,关于 Profiler,我还想了解一件事。
有没有一种方法可以实际查看哪些行(在哪个表中)将被更新。
从我上面的信息中,我只能看到有一个更新(所以我假设它是 table1 上的这个更新,这是我所期望的)。但我想在这个表中看到类似的信息:'tablename'这个行:行列表将使用这些值或类似的东西进行更新......
这可以用探查器吗?