1

的SQL Server 2005/2008,DB =用户=架构=所有者= '约翰',ASP.net 2.0.50727,VB,IIS7SQL服务器“找不到存储的过程,而不架构名称

我将网站从一台服务器移动到另一台。这段代码在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上运行我得到了一个错误:

Could not find stored procedure 'SP_Name'. pointing at last line.

我可以看到“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。感谢所有参与者。

+0

从您发布的帮助文件'的SQL Server 2008系统的匹配过程名称时使用调用数据库归类。因此,您应该始终在应用程序中使用系统过程名称的确切大小写。 ' – JonH

+0

:例如,如果在具有区分大小写的归类的数据库的上下文中执行该代码将失败“例如,如果在具有区分大小写的归类的数据库的上下文中执行该代码将失败:” - 评论结束或我看不到结尾。 我刚刚检查**登录**(不是用户)约翰,发现没有映射到约翰DB。我可以标记复选框,正确的用户名和模式apear,按'确定',再次打开此登录,并查看此复选框是否干净。没有错误信息,日志中没有错误。请指教。 – Putnik

+0

@JonH“例如,如果在具有区分大小写的排序规则的数据库的上下文中执行,则此代码将失败:” - 并且注释已结束或我看不到结尾。 – Putnik

回答

0

不幸的是,我没有找到精解。我采用的方式是将整个项目的SP_Name替换为John.SP_Name。感谢所有参与者。

1

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

我知道你已经提到过这个,但我会仔细检查你的代码使用的用户是什么作为默认模式。如果没有指定架构,SQL Server将第一次使用的用户的缺省模式,如果找不到DB对象,然后它会尝试DBO模式,如果不工作,你会看到你看到的那个错误。

+0

我检查了:DB/Security/Users/John。默认模式是John。 5分钟前我创建的过程,“dbo.SP_Name” - 和**这**错误已经走了,但在这种情况下,我会,因为有很多错误的出现这样的重命名后的内部程序改写每1100个程序。 – Putnik

+0

@Putnik运行跟踪并查看当您从原始帖子中收到错误时发生了什么。你会看到发生了什么。将模式“John”中的所有存储过程更改为“dbo”应该相当容易。只是一些代码逻辑,目录视图和一点动态SQL。 – 2011-10-25 19:41:49

+0

谢谢,我会运行跟踪。 不幸的是,我意识到如何改变SP名称,但不知道如何修复SP内部。 – Putnik

2

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

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

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

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

+0

默认模式不是'dbo',而是'John' - 我只是再次检查它。 5分钟前我创建了程序'dbo.SP_Name' - 并找到它。所以SQL服务器在dbo。*程序之间寻找,但我必须找到一种方法来改变这一点。有1100个约翰*程序,所以我会生气直到修补整个代码。 – Putnik

+0

ps:我只用SP_ *作为例子,实际前缀和用户| schema是不同的。 – Putnik

0

为SQL Server 2008的默认模式是 “DBO”。这就是为什么它试图打dbo.SP_Name

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

+0

但此用户的默认架构是John!我只是再检查一次。 – Putnik

1

在SQL Server>数据库>数据库名称“安全”架构

选择DBO架构>性能> SELECT权限>

在此找到部分

“用户和角色” 添加你登录用户名和用户名的权限进行检查执行。

0

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