我在MySQL数据库中创建了一个存储过程'myProc'。 然后我放弃了这个程序。 我想再创建一个与之前名称相同的程序。 我再次创建程序并将其命名为'myProc'。
CALL myProc();
但是,当我执行此过程时,它是"PROCEDURE myProc does not exit"
之类的错误。
代码也与之前的代码相同。
答案 0 :(得分:1)
无法在MySQL中调用存储过程
您已在MySQL 5中创建了一个过程。您已为应用程序的用户帐户授予EXECUTE权限。但是,当您的应用程序准备一个语句来调用该过程时,会抛出异常。也许它是ConnectorJ内部的NullPointerException。也许该例外声称该程序不存在。或许你已经足够幸运得到引导你走正确路径的异常(驱动程序要求声明程序要么包含''\ 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不存在”的消息,则app用户没有权限。返回根窗口并授予它们。
GRANT EXECUTE ON PROCEDURE myproc TO appuser;
可能发生的第二件事是将找到该程序,但不会列出正文。相反,它会说“创建过程:NULL”。如果是这样,请返回根窗口并进行处理。
GRANT SELECT ON mysql.proc TO appuser;
可能发生的第三件事是你想要发生的事情;该程序的正文将被列出。现在,您应该可以从应用程序中调用该过程。
警告
你可能会想要采取一些捷径来解决这些问题。请不要。快捷方式可能会导致更大的问题。
您可能尝试的第一件事是在您的应用程序中使用root帐户。这非常危险。安全性层层叠叠。虽然您应该使用存储过程和预准备语句来避免SQL注入攻击,但您还应该应用最小权限原则,以防它们无论如何发生。允许您的应用程序以root身份连接,攻击者可以访问您最宝贵的资源:您的数据。但是,给应用程序的每个部分一个单独的帐户,只有它需要隔离坏人的权限。
经过数小时研究后,您可能会尝试的另一件事是在ConnectorJ连接字符串中设置“noAccessToProcedureBodies”标志。请避免使用此标志,因为它会绕过JDBC驱动程序为您提供的参数类型检查。此标志使ConnectorJ将所有参数转换为字符串,然后MySQL将转换回所需的类型。
但是,通过逐步解决问题,这些捷径不应该是必要的。
参考