MS SQL Server是否有一些配置选项可以启用更详细的错误消息。
具体示例:我希望在插入过程中看到插入记录的实际字段值违反约束,以帮助跟踪存储过程中我无法重现的错误。
答案 0 :(得分:2)
我不相信有这样的选择。有一些跟踪标志可以提供有关死锁的更多信息,但是我从来没有听说过提供有关约束违规的更多信息的标记。
如果您控制导致崩溃的应用程序,那么扩展它的处理(如Jenn建议的那样)以包含参数值等。一旦获得参数值,您就可以获得非实时设置的副本实时服务器并开始调试问题。
对于更多选项,受影响的任何用户都可以可靠地重现该问题吗?如果可以,那么您可以运行探查器跟踪来捕获发送到数据库的实际语句/参数值。当然,如果你能找出重现问题的步骤,那么你可以使用更传统的调试方法......
你不能说出约束是什么,我假设它是一个相当复杂的约束。如果是这样,它可以分解为几个约束,以便您可以获得有关数据问题的更多提示吗?
您还可以将约束重新编写为触发器,然后可以在其引发的错误中包含更多信息。虽然在部署到生产服务器之前显然需要进行测试!
就个人而言,我会改变应用程序的错误处理。这可能是风险较小的变化。
PS我帮助编写的应用程序,现在花费我的时间支持,在发生未处理的异常时记录了大量数据。如果是在保存期间,那么我们的数据访问层会附加作为保存事务的一部分运行的所有命令的完整列表,包括参数值。事实证明,这在许多场合都是非常宝贵的,包括一些在追踪约束违规时的情况。
答案 1 :(得分:2)
在存储过程中,我在复杂的SP中获得关于错误的更好信息是利用表变量不受回滚影响的事实。所以我在创建它时将我想要用来解决表变量的信息放到表变量中,然后如果我点击catch块并回滚,在回滚后我将表变量中的数据与一些元数据一起插入到异常表中像datetime这样的数据。
有些人认为你可以设计一个异常表来捕获几乎任何proc所需要的东西(例如你可以将所有输入变量连接到一个字段中,你可以输入失败的步骤号(当然那么)你必须为一个变量分配stepnumbers)或者你可以记录每个步骤,然后记录的最后一个是失败的那个。当你正在考虑对100行SP进行故障排除时,请相信我,这可以派上用场。如果我有dymanic SQl inteh proc,我可以记录包含已运行的动态代码的SQL变量。
现在您不必尝试重现错误,您知道输入参数是什么以及您认为有用的任何其他信息。是的,设置一次可能需要一些时间,但是一旦你这样做,相对容易养成将它放入任何你想要记录错误的复杂过程的习惯。
如果要返回用于插入的select的spefic数据值或select的结果集,您可能还想设置一个非常量的数据值,该结果集将告诉您正在更新或删除的wopuld。那么只有在proc失败时才会有。这比一般异常表稍微多一点,但在某些复杂情况下可能需要它。