2009-11-16 57 views
0

我有一个使用相同存储过程创建记录然后附加详细记录的±20客户端的分布式部署。我们注意到主记录的标识字段存在差距。在这种情况下,我们没有使用事务,所以我们能够弥补差距的唯一原因是其中一位开发人员正在某个地方吞下异常。有没有一个失败的查询或查询列表引发异常记录的地方?SQL Server 2000会记录在任何地方产生错误的查询吗?

是否有任何其他建议去的问题查询之外:

  • 使用SQL事件探查
  • 创建具有相同签名镜表,但与各界为空的,没有引用,那么扩大存储过程插入到该表中,然后再看到如果某些输入的是空白/坏

回答

2

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

正如chadhoc所说,试图找到这个活动的一种方法是设置一个跟踪来监视它。这样做超过20多台服务器跨越多少天,然后分析结果,这是一项不重要的任务。 (我会配置第一次通过异常事件,并根据您的应用程序,批量启动,存储过程启动或RPC启动之一)。

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

2

没有办法让信息从SQL 2000以外的情况使用跟踪(虽然我推荐一个server-side-trace over using profiler像往常一样)。您可以轻松地将跟踪限制为包括仅包含该表的批处理启动/结束事件以及事务启动/结束和异常事件类。

注意,也有其他的方法你可以得到认同的差距,包括:

  • ROLLBACK进行(在非提交的事务中使用的身份不会回滚,他们只是继续向上移动,或者下来,如果你已经配置了身份等)
  • 复制
  • 明确更新的标识种子/电流值
  • 删除
  • 等等
1

间隙通常来自插入被回滚的时间。不必在显式事务中回滚。例如,假设你有一个日期字段,并且有人为那个不是有效日期的字段发送一个输入值。插入将失败并被回滚,从而导致身份值出现空白。

你永远无法期待身份领域没有差距。它根本不会发生。