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。感谢所有参与者。
答案 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)