【问题标题】:Problem calling stored procedure from another stored procedure via classic ASP通过经典 ASP 从另一个存储过程调用存储过程的问题
【发布时间】:2008-09-20 08:03:38
【问题描述】:

我们有一个简单的经典 ASP 应用程序,我们一直不愿意修改代码,以免引起一些早已死去的希腊神灵的愤怒。

我们最近需要向应用程序添加一项功能。功能实现实际上只是一个数据库操作,只需要对 UI 进行最少的更改。

我更改了 UI 并进行了小修改以向 sproc 调用 (sproc1) 提交一个新的数据值。

在直接从 ASP 调用的 sproc1 中,我们添加了对另一个恰好位于另一台服务器 sproc2 上的 sproc 的新调用。

不知何故,这在我们的 ASP 应用程序中不起作用,但在 SQL Management Studio 中起作用。

以下是技术细节:

  1. 两个数据库服务器上的 SQL 2005。
  2. Sql Login 正在从 ASP 应用程序向 SQL 2005 Server 1 进行身份验证。
  3. 从服务器 1 到服务器 2 的链接服务器正在工作。
  4. 从 SQL Management Studio 执行 sproc1 时 - 工作正常。即使被认证为我们的代码使用的同一用户(应用程序 sql 登录)。
  5. 当从 SQL Management Studio 独立于 sproc1 调用时,sproc2 可以工作。
  6. VBScript (ASP) 捕获一个错误,该错误在 XML 中发送回客户端。错误编号为 0,错误描述为空白。来自 ADODB.Connection 对象和来自 ASP 端在 VBScript 中产生的任何 Err.Number/Err.Description。

所以没有任何错误,也没有任何再现性(即通过 SQL Mgmt Studio)- 有人知道这个问题吗?

我们目前的计划是分解并深入研究 ASP 端的代码,并直接从 ASP 对 Server 2.sproc2 进行完全独立的调用,而不是尝试通过 sproc1 捎带。

【问题讨论】:

标签: sql-server stored-procedures asp-classic vbscript cross-server


【解决方案1】:

您是否在两个存储过程中都设置了 set nocount on?我曾经遇到过类似的问题,虽然我现在不记得我是如何解决的,但我知道这与它有关!

【讨论】:

    【解决方案2】:

    您可能正在遭受double-hop problem

    双跳问题是当 ASP/X 页面尝试使用位于不同于 IIS 服务器的服务器上的资源时。

    Windows NT Challenge/Response does not support 双跳模拟(一旦传递到 IIS 服务器,相同的凭据就无法传递到后端服务器进行身份验证)。

    您应该使用 SQL Profiler 验证尝试的第二个连接。

    请注意,您的手动测试并非通过 IIS 进行身份验证。只有当您通过 ASP/X 页面启动 sql 时才会出现此问题。

    更多资源:

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我通过设置 nocount 并删除打印命令来解决它。

      【讨论】:

        【解决方案4】:

        我的第一反应是,这可能不是调用跨服务器的问题,而是从第一个调用第二个 proc 的问题,并且 this 可能是两个不同的行为不同的原因环境。

        我的第一个问题是:如果从等式中删除跨服务器方面会发生什么?如果您可以设置一个测试系统,其中您的第一个 proc 调用您的第二个 proc,但第二个 proc 位于同一服务器和/或同一数据库中,您还会遇到同样的问题吗?

        按照同样的思路:根据我的经验,当应用程序和 SSMS 得到不同的结果时,通常是存储过程的设置问题。正如卢克所说,它可能是NOCOUNT。尽管我似乎记得 PRINTed 值成为错误描述的一部分(非常违反直觉),但我已经从代码中无关的 PRINT 语句中发生了这种事情。

        如果在 SSMS 中运行此消息时在消息窗口中返回 anything,请找出它的来源并使其停止。我必须查找技术术语,但我记得不同的查询环境对“错误”的敏感性不同,并且通过 SSSM 的默认连接不会在某些时候抛出错误,而来自脚本语言的 ADO 连接将.

        最后一个想法:如果是环境问题,请尝试在 ASP 页面的连接字符串上设置不同的设置。例如,如果您有 OLEDB 连接,请尝试 ODBC。尝试本机和非本机 SQL Server 驱动程序。查看您的提供程序支持哪些连接字符串选项,并尝试其中任何一个似乎值得尝试的选项。

        【讨论】:

        • 我终于能够实现这段代码了。我从 ASP 中断了对 SPROC2 的调用。仍然有错误!我查看了 NOCOUNT 和 PRINT 的代码(以及其他任何可以提供输出的代码),但无济于事。我最终写了一个 hack,因为错误号 = 0 一致。
        【解决方案5】:

        示例代码可能会有所帮助:) 您是否尝试从存储过程中返回两个表?我不认为 ADO 2.6 可以处理返回的多个表。

        【讨论】:

          【解决方案6】:

          我确实考虑过(双跳),但是像我所指的 sproc-in-a-sproc 调用与通过 INNER JOIN 进行的典型跨服务器连接之间有什么区别?两者都将在 Server1 上执行,使用 Linked Server 凭据,并向 Server 2 进行身份验证。

          任何人都可以确认调用 sproc 跨服务器与在数据表上进行连接不同吗?为什么?

          如果链接服务器配置是 sql 帐户 - 这是否被视为双跳(因为您指的是 NTLM 双跳?)

          关于是否有多个结果集返回 - 没有。 Server1.Sproc1 和 Server2.Sproc2 在 .net 世界中都是“ExecuteNonQuery()”并且什么都不返回(没有结果集也没有返回值)。

          【讨论】:

            【解决方案7】:

            尝试检查连接字符串中指定的用户对数据库的权限。 使用sql mgmt studio时,在连接字符串中使用相同的用户名登录数据库。

            创建一些临时表来写入中间值和异常,因为它是调试应用程序的有效方法。

            【讨论】:

              【解决方案8】:

              我可以检查一下:您添加了 sproc2 吗?在此之前,它运行良好多年。

              你不能改变你从哪里调用 sproc2 吗?与其从 sproc1 内部调用它,不如从 ASP 调用它?这样您就可以在代码中控制对 SQL 的身份验证,而不必依赖在服务器上设置任何信任或共享远程身份验证。

              【讨论】:

                【解决方案9】:

                您的链接服务器是如何设置的?对于如何向远程服务器进行身份验证,您通常有一些选项,其中包括以当前登录用户身份登录或指定始终使用的 SQL 登录名。您是否尝试将其设置为始终使用特定帐户?这应该消除调用远程过程中任何可能的权限问题...

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-09-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-05
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多