2012-06-15 63 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