【问题标题】:Stored Procedure failing on a specific user存储过程在特定用户上失败
【发布时间】:2010-09-21 07:48:30
【问题描述】:

我有一个存储过程不断失败,并在特定用户上显示错误消息“超时已过期”。

所有其他用户都可以正常调用 sp,甚至我也可以使用查询分析器正常调用 sp——它只需 10 秒即可完成。但是对于有问题的用户,日志显示 ASP 总是挂起大约 5 分钟,然后超时中止。

我像这样从 ASP 页面调用“EXEC SP_TV_GET_CLOSED_BANKS_BY_USERS '006111'

有人知道如何诊断问题吗?我已经尝试查看数据库中的死锁,但没有找到。

谢谢,

【问题讨论】:

  • “特定用户”是什么意思?运行 SP 的用户,还是查询中的这个 006111?
  • '006111' 是失败的用户 ID,尽管如果我在查询分析器中调用它,SP 会在大约 10 秒内完成。
  • 我正要问,用户的名字是“Robert'); DROP TABLE EMPLOYEES;--?”
  • 执行上下文有问题吗?也就是说,您可以从 ASP 页面(不是查询分析器)运行这个存储过程,并且只运行这个存储过程并让它工作,还是它仍然超时?
  • 就像我说的,其他调用页面的用户可以调用 SP 就好了。我能找到的唯一其他异常情况是 sp 被加载到记录集中,并且该记录集在对该特定用户执行“rsUBanks.MoveFirst”时崩溃了两次。

标签: sql sql-server asp-classic timeout sql-server-2000


【解决方案1】:

我想回答你的问题,我们可能需要更多信息。

例如,您是否使用 Active Directory 来验证您的用户?您是否使用过 SQL 探查器进行调查?听起来这可能是一个身份验证问题,SQL Server 在验证此特定用户时遇到问题。

【讨论】:

    【解决方案2】:

    听起来像是死锁问题..

    还要确保此用户在 SQL Server 中具有执行权限和读取权限

    但是,如果当时正在写入信息,因为它试图被读取,您将死锁,因为事务尚未提交。

    Jeff 写了一篇很棒的文章,讲述了他在这方面的经验和 stackoverflow。 http://www.codinghorror.com/blog/archives/001166.html

    【讨论】:

      【解决方案3】:

      需要检查的几件事:

      1. 这是否只发生在特定用户的机器上?他可以从另一个人那里试试吗 机器? - 可能是客户端配置问题。
      2. 您能否捕获该特定用户运行的实际字符串并从 ASP 页面运行它?用户执行 SP 的方式可能会生成循环或大量数据。
      3. 最后,如果您使用的是组织内应用程序,则您的特定用户的权限可能与其他用户不同。您可以在 Active Directory 级别进行比较。

      现在,我可以推荐一款绝对可以解决您的问题的商业软件。它记录端到端事务,并分析特定故障。但是我不想在这个论坛上做广告。如果你愿意,请给我留言,我会解释更多。

      【讨论】:

        【解决方案4】:

        好吧,我建议您使用 SQL Server Profiler 并打开一个新会话。从您的 ASP 页调用您的存储过程,看看发生了什么。虽然这可能无法解决您的问题,但它肯定可以为您提供一个起点,让您自己进行一些“调查”。

        【讨论】:

          【解决方案5】:

          一些想法...

          读取 cmets 表明是参数嗅探导致了问题。

          • 对于其他用户,缓存的计划足以满足他们发送的参数
          • 对于这个用户,缓存的计划可能是错误的

          如果此用户的行数远多于其他用户,或者在另一个表中有行(因此不同的表/索引查找/扫描会更好),则可能会发生这种情况

          测试参数嗅探:

          • 在调用或定义中使用 RECOMPILE(临时)。对于复杂的查询,这可能会很慢
          • 超时后重建索引(或只是统计信息)并重试。这会使所有缓存的计划无效

          修复: 屏蔽参数

          DECLARE @MaskedParam varchar(10)
          SELECT @MaskedParam = @SignaureParam
          
          SELECT...WHERE column = @MaskedParam
          

          只需谷歌“参数嗅探”和“参数屏蔽”

          【讨论】:

          • 这听起来确实是问题的原因。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          • 2019-07-07
          • 1970-01-01
          • 2019-04-27
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多