1

我有一个 nodejs 服务,它试图在 mysql 数据库上运行存储过程,但调用失败并显示execute command denied to user.

同一个服务可以成功执行 simple SELECTs 并毫无问题地返回数据。

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

为什么远程运行存储过程失败,但在本地运行它?

编辑

按照下面的建议,这是show grants从命令行访问 mysql 时运行的结果: 在此处输入图像描述

这是我通过我的节点应用程序运行它时的结果:

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

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

4

1 回答 1

1

请记住,这是与任何其他远程用户'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 服务器的不同实例。正常运行时间会有所不同,因为它每秒都在变化,但它应该与从每个客户端执行查询之间的时间一致。

于 2021-02-09T16:37:09.833 回答