SQL Server 2000是否记录在任何地方产生错误的查询?

时间:2009-11-16 14:07:05

标签: sql-server logging

我使用相同的存储过程进行了20个客户端的分布式部署,以创建记录,然后附加详细记录。我们已经注意到主记录的标识字段中存在间隙。我们在这个例子中没有使用事务,所以我们能够找到差距的唯一原因是其中一个开发人员正在某个地方吞下一个例外。是否存在失败的查询或查询列表,这些查询或查询会在某处记录异常?

除此之外还有其他建议可以解决问题:

  • 使用SQL事件探查器
  • 创建一个具有相同签名但所有字段都可以为空且没有引用的镜像表,然后将存储过程首先插入到该表中,然后查看某些输入是否为空白

3 个答案:

答案 0 :(得分:2)

除了使用跟踪之外,无法从Sql 2000中获取该信息(虽然我像往常一样推荐server-side-trace over using profiler)。您可以轻松地将跟踪限制为包括仅包含该表以及事务开始/结束和异常事件类的batchstart / end事件。

请注意,还有其他方法可以获得身份差距,包括:

  • ROLLBACK(未提交的事务中使用的身份不会回滚,只会继续向上或向下移动,如果您已配置身份)
  • 复制
  • 标识种子/当前值的显式更新
  • 删除

答案 1 :(得分:2)

SQL Server 2000(及更高版本)不会自动记录仅生成“数据”错误的查询。它记录生成严重错误的查询(例如RAISERROR级别20及以上),并且任何此类错误都将记录在Windows应用程序事件日志中。然而,似乎很可能导致你的游戏不会产生这些错误,因为你现在可能已经注意到了其他问题。

正如chadhoc所说,试图找到这个活动的一种方法就是设置跟踪来观察它。这样做可以在[多少?]天内处理20多个服务器,然后分析结果,这是一项非常重要的任务。 (我将使用异常事件配置第一个传递,并根据您的应用程序配置批处理启动,存储过程启动或RPC启动之一。)

另一种策略:不是通过“扩展”存储过程填充的镜像表,而是在填充日志表的表上尝试INSERT触发器。 (这将捕获所有插入,而不仅仅是存储过程所完成的插入。)日志表将跟踪ID,插入时间以及您可能发现有用的任何其他信息(谁执行登录,调用应用程序,以及其他任何数据)对调试很有用)。它可能最终看起来像一个镜像表,但它不一定是。如果仍然出现差距,那么您肯定知道您正在回滚交易。 (请记住,如果只是第一个INSERT语句失败并且永远不会插入行,它仍然“使用”一个标识值。)

答案 2 :(得分:1)

通常从插入物卷回时开始。不必在显式事务中回滚。例如,假设您有一个日期字段,并且有人发送该字段的输入值,该输入值不是有效日期。插入将失败并回滚,从而导致标识值出现间隙。

你不能指望身份字段没有间隙。它根本不会发生。