没有架构名称的SQL Server“无法找到存储过程”

时间:2011-10-25 17:27:59

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

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 management studio'的程序不是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。感谢所有参与者。

7 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在SQL Server中>数据库>您的数据库名称>安全>模式

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

@putnik已经选择了答案,但是对此有解决方案。

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

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

选择相关用户的属性=>选择常规=>选择默认模式=>

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

enter image description here