【问题标题】:SQL Server 'Could not find stored procedure' without schema name没有架构名称的 SQL Server '找不到存储过程'
【发布时间】:2011-10-25 17:27:58
【问题描述】:

SQL Server 2005/2008、db=user=schema=owner='John'、ASP.net 2.0.50727、vb、IIS7

我正在将网站从一台服务器移动到另一台服务器。这段代码在装有 SQL Server 2005 的旧服务器上运行良好。

    Dim sqlCmdVehicle As SqlCommand = New System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)
    Dim dtVehicle As New DataTable

    With sqlCmdVehicle
        .Parameters.AddWithValue("FullStockNo", "N102010")
        .CommandType = CommandType.StoredProcedure
    End With

    sqlConn.Open()
    sqlAdapter.SelectCommand = sqlCmdVehicle
    sqlAdapter.Fill(dtVehicle)

数据库已备份并在新服务器上成功恢复。当我尝试使用新的 SQL Server 2008 运行时,出现错误:

找不到存储过程“SP_Name”。指向最后一行。

我可以看到带有“MS SQL 管理工作室”的过程不是 dbo.SP_Name 而是 John.SP_Name

当我改变时

System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)

进入

System.Data.SqlClient.SqlCommand("John.SP_Name", sqlConn)

一切正常,但所有其他程序和代码中的许多此类地方都是一样的:(

我收到了http://msdn.microsoft.com/en-us/library/ms189915.aspx,但调用者的默认架构是正确的。 同样,在旧盒子上一切正常。

我应该在 SQL 中修复什么以允许在没有明确提及用户/模式名称的情况下运行 SP?

谢谢。

========================================

很遗憾,我没有找到好的解决方案。我采取的方法是将整个项目的 SP_Name 搜索并替换为 John.SP_Name。感谢所有参与者。

【问题讨论】:

  • 来自您发布的帮助文件SQL Server 2008 uses the calling database collation when matching system procedure names. Therefore, you should always use the exact case of system procedure names in your application. For example, this code will fail if executed in the context of a database that has a case-sensitive collation:
  • "例如,如果在具有区分大小写排序规则的数据库上下文中执行此代码将失败:" - 并且注释已结束或我看不到结尾。我刚刚检查了 login(不是用户)John,发现没有映射到 John DB。我可以标记复选框,显示正确的用户名和架构,按“确定”,再次打开此登录,并看到此复选框干净。没有错误消息,日志中没有错误。请指教。
  • @JonH "例如,如果在具有区分大小写排序规则的数据库的上下文中执行此代码将失败:" - 并且注释已结束或我看不到结尾。

标签: asp.net sql-server sql-server-2005 sql-server-2008 stored-procedures


【解决方案1】:

我不是 100% 确定,但您可能使用 sql username/pw 连接到数据库,然后使用用户名“john”。

在这种情况下,您的默认架构也是“john”,您必须直接使用 dbo.SP_name 才能正确访问您的过程。

还可以将用户 john 的默认 shema 设置为用户数据库“dbo”。您可以在用户的​​属性菜单中执行此操作。

Sitenote:不要使用 sp_。如果您创建自己的程序,请使用例如proc_ 代替。 使用 sp_ 总是使 SQL 服务器首先在 master 数据库中查找。这会降低性能。

【讨论】:

  • 默认架构不是 'dbo' 而是 'John' - 我只是再检查一次。 5 分钟前我创建了程序 'dbo.SP_Name' - 它被发现了。所以 SQL server 在 dbo.* 程序中寻找,但我必须想办法改变这一点。有 1100 个 John.* 程序,所以我会生气,直到修补整个代码。
  • ps:我只使用了SP_*,实际前缀和用户|模式不同。
【解决方案2】:

我们今天发现,如果您将用户权限更改为 SQL Server 上的系统管理员,即使您在数据库中为您的用户指定了默认架构,如果您尝试运行存储的没有指定schema名称的procedure,会认为存储过程是dbo schema下的!当您删除登录用户的 sysadmin 权限时,如果您在 EXEC 命令中未指定架构名称,它将使用为该用户设置的默认架构运行存储过程。

【讨论】:

  • 正如您所说,我创建了一个没有 sysadmin 的用户,但重要的一点是您应该从默认架构中删除 dbo 并选择您要使用的架构。这就对了。它奏效了。
【解决方案3】:

如果您运行 SQL Profiler 并查看跟踪数据,您将确切知道发生了什么。您将看到对数据库的确切调用以及发生了什么。

我知道您已经提到了这一点,但我会仔细检查您的代码使用的用户是什么作为默认架构。如果未指定架构,SQL Server 将首先使用用户的默认架构,如果找不到该 DB 对象,则会尝试 dbo em> 架构,如果这不起作用,您将看到您看到的错误。

【讨论】:

  • 我检查了:DB/Security/Users/John。默认架构是 John。 5 分钟前,我创建了程序 'dbo.SP_Name' - this 错误已经消失,但在这种情况下,我必须重写 1100 个程序中的每一个,因为在此之后程序内部会出现很多错误重命名。
  • @Putnik 运行跟踪并查看当您从原始帖子中收到该错误时发生了什么。你会看到发生了什么。将所有存储的过程从架构John 更改为dbo 应该相当容易。只是一些代码逻辑、目录视图和一点动态 SQL。
  • 谢谢,我会运行跟踪。不幸的是,我知道如何更改 SP 名称,但不知道如何在 SP 内部修复。
  • @Putnik 啊,好点子。这是一个艰难的情况。我敢肯定这是我们只是缺少的东西。这类事情不会随机发生。
【解决方案4】:

在 SQL Server 中> 数据库> 您的数据库名称> 安全性> 架构

选择 dbo 架构 > 属性 > 选择权限 >

在那找到“用户和角色”部分

添加您的登录用户名和用户名权限以检查执行。

【讨论】:

    【解决方案5】:

    SQL Server 2008 的默认架构是“dbo”。这就是为什么它试图点击 dbo.SP_Name

    您需要为用户设置默认架构。请参阅以下问题: Can you set default Schema for SQL 2008 Query

    【讨论】:

    • 但该用户的默认架构是 John!我只是再检查一遍。
    【解决方案6】:

    很遗憾,我没有找到好的解决方案。我采取的方法是将整个项目的 SP_Name 搜索并替换为 John.SP_Name。感谢所有参与者。

    【讨论】:

      【解决方案7】:

      @putnik 已经选择了答案,但有一个解决方案。

      请参考@Joe P 的回答。您不应使用 sysAdmin 创建用户。而不是您必须从默认架构中删除 dbo 并选择要使用的架构。

      在 SQL Server => 数据库 => 数据库名称 => 安全 > 用户

      选择相关用户的属性 => 选择常规 => 选择默认架构 =>

      单击三个点 => 浏览对象 => 选择相关架构而不选择 dbo 架构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        • 2014-09-01
        • 2014-08-17
        相关资源
        最近更新 更多