【发布时间】:2014-05-28 09:22:26
【问题描述】:
我使用 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',因为我们在服务器上有很多 db,所以为了只跟踪我的名为 'my_db_name' 的数据库
2.'跟踪属性>事件选择>存储过程>启用SP:StmtStarting和SP:StmtCompleted',因为我想启用触发器跟踪
似乎来自 DBVisualizer 的这条信息具有误导性(这只发生在具有触发器的表中——在这种特殊情况下,触发器在每次更新时将数据插入到另一个表(所谓的存档表)中)。实际上,只完成了一次更新,所以一切都很好。
Microsoft SQL Server Management Studio 显示正确信息:1 次更新和 1 次插入。
希望这会帮助有类似“问题”的人。 @TomTom 请将您的评论作为答案,这样我就可以给您好评。谢谢你。
不过,关于 Profiler,我还想了解一件事。
有没有一种方法可以实际查看哪些行(在哪个表中)将被更新。
从我上面的信息中,我只能看到有一个更新(所以我假设它是 table1 上的这个更新,这是我所期望的)。但我想在此表中查看类似信息:'tablename' 此行:行列表将使用这些值或类似的内容进行更新...
Profiler 可以做到这一点吗?
【问题讨论】:
-
考虑自己做一些工作。很明显,有 2 个命令问题。 FinTrace 它们 - 使用分析器 - 并检查它们是否是您认为的那样。
-
好的,谢谢@TomTom 的回复。您有任何推荐用于 MS SQL Server 数据库的分析器工具吗?还是我不知道的 db 或 DBVisualizer 附带的东西?
-
嗯,它是 SQL SERVER 附带的东西。为什么忽略你已经拥有的所有工具......
-
我没有忽略它,我只是没有意识到它,因为我以前没有使用它。此外,谷歌搜索它,我注意到 msdn 说他们将来会弃用它。我不明白你为什么用这种居高临下的语气?你想帮忙还是玩聪明?
-
通过阅读文档,对不想学习他们做什么的人采取零容忍政策。就这么简单。