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