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命令中未指定任何模式名稱,它將使用爲該用戶爲該數據庫設置的默認模式運行該存儲過程。