MySQL 在远程 运行 存储过程时抛出 "execute command denied to user"

MySQL throwing "execute command denied to user" when running stored procedure remotely

我有一个 nodejs 服务正在尝试 运行 mysql 数据库上的存储过程,但调用失败 execute command denied to user

相同的服务可以成功执行简单的 SELECTs 和 return 数据,没有任何问题。

如果我使用 mysql 命令行实用程序连接到 mysql 数据库,并以 nodejs 服务配置使用的相同用户身份登录,那么存储过程就可以正常工作了。

为什么 运行远程连接存储过程失败,但 运行本地连接它却能正常工作?

编辑

按照下面的建议,这是在从命令行访问 mysql 时 运行ning show grants 的结果:

这是我通过节点应用 运行 得到的结果:

{"Grants for myuser@%":"GRANT USAGE ON *.* TO `myuser`@`%` IDENTIFIED BY PASSWORD '*blahblahblahblahblahblah'"}

我不明白为什么 GRANT SELECT, INSERT 等消失了,因为我认为使用 % 通配符意味着它不应该关心它认为 myuser 来自哪个域。

请记住,'user'@'localhost' 是不同于 'user'@'%' 或任何其他远程用户的用户规范。他们实际上是两个不同的用户,他们可以拥有不同的权限集。

我建议您以本地用户身份连接并 运行 SHOW GRANTS;。然后远程连接也一样。

您需要 EXECUTE 权限才能执行程序。我认为当您以用户身份远程连接时,该权限将丢失。


回复您更新后的问题:

显示的权限仅包括 USAGE,表示用户可以登录(即验证)但没有任何权限。但是用户身份 'myuser'@'%' 与存在多个权限的其他情况相同,包括 EXECUTE.

我会尝试验证您实际上连接到 MySQL 的同一个实例。

执行以下查询并检查它们是否在您的应用程序会话和交互式会话中给出相同的结果:

SELECT @@hostname, @@port, @@socket;
SELECT @@server_uuid, @@server_id;
SELECT USER();
SELECT VERSION();
SHOW GLOBAL STATUS LIKE 'Uptime';

如果他们不这样做,那么您的节点应用程序正在连接到 MySQL 服务器的不同实例。正常运行时间会有所不同,因为它每秒都在变化,但它应该与您从每个客户端执行查询之间的时间一致。