2012-06-15 61 views
1

我在MySQL數據庫中創建了一個存儲過程'myProc'。 然後我放棄了這個程序。 我想再次創建一個與前面相同的程序。 我再次創建過程並將其命名爲「myProc」。在MySQL數據庫中再次創建存儲過程

CALL myProc(); 

但是,當我執行這個程序,它就是這樣"PROCEDURE myProc does not exit"錯誤。 另外代碼與之前的代碼相同。

+2

做'SHOW PROCEDURE STATUS;',它說什麼了? –

+0

我假設'call mypro()'是一個錯字?請注意粘貼你有什麼,而不是重新鍵入,所以它更容易找到真正的錯別字,只有在這樣:) :) – Nanne

+0

樣本是無處再現問題。 [示例代碼](http://sscce.org/)應該是完整的,簡潔和具有代表性的。 – outis

回答

1

無法調用MySQL中

你在MySQL 5,創建的過程您已經授予執行權限給應用程序的用戶帳戶的存儲過程。但是當你的應用程序準備一個聲明來調用該過程時,會拋出異常。也許這是ConnectorJ內部的一個NullPointerException。也許該例外聲稱該程序不存在。或者,也許你已經足夠幸運了,以獲得引導你走向正確路徑的異常(Driver需要程序聲明以包含''\ nbegin''或''\ n''以跟隨參數聲明或SELECT特權在mysql.proc解析列類型)。以下是我搜索MySQL論壇幾個小時蒐集的故障排除步驟。

首先打開兩個控制檯窗口。其中之一是以應用程序用戶身份登錄MySQL。另一方面,以root身份登錄。在你的應用程序窗口中,列出數據庫。

SHOW DATABASES; 

如果您的應用程序的數據庫沒有出現,那麼您應該到您的根窗口並授予數據庫特權。

USE mydatabase; 
GRANT ALL ON mydatabase TO appuser; 

現在回到應用程序窗口。再次列出數據庫以確保其顯示。現在,它進入它。

USE mydatabase; 

一旦進入,請嘗試查看過程。

SHOW CREATE PROCEDURE myproc /G 

會發生三件事情之一。如果您收到消息「PROCEDURE myproc does not exist」,那麼應用程序用戶沒有權限。回到根窗口並授予他們。

GRANT EXECUTE ON PROCEDURE myproc TO appuser; 

可能發生的第二件事是該過程將被發現,但身體不會被列出。相反,它會說「創建過程:NULL」。如果是這樣,請回到根窗口並照顧它。

GRANT SELECT ON mysql.proc TO appuser; 

可能發生的第三件事是你想要發生的事情;程序的主體將被列出。現在您應該可以從您的應用程序中調用該過程。

警告

你可能會被採取了幾個快捷方式來解決這類問題。請不要。捷徑可能會導致更嚴重的問題。

您可能會嘗試的第一件事是在您的應用程序中使用root帳戶。這是非常危險的。安全層出不窮。雖然您應該使用存儲過程和準備語句來避免SQL注入攻擊,但您仍應該應用最小權限原則,以防萬一它們發生。允許應用程序以根用戶身份進行連接,攻擊者可以訪問最有價值的資源:數據。但是,爲應用程序的每個部分提供一個單獨的帳戶,只需要它需要隔離壞人的特權。

經過數小時的研究,您可能會嘗試的第二件事是在ConnectorJ連接字符串中設置「noAccessToProcedureBodies」標誌。請避免使用此標誌,因爲它會繞過JDBC驅動程序爲您提供的參數類型檢查。此標誌使ConnectorJ將所有參數轉換爲字符串,然後MySQL將轉換回所需的類型。

但是通過逐步解決問題,這些捷徑不是必需的。

參考

http://adventuresinsoftware.com/blog/?p=74