mariadb 为什么Java应用程序不能执行的过程,如果我添加了授予所有特权?

rpppsulh  于 2022-11-08  发布在  Java
关注(0)|答案(1)|浏览(152)

我有一个使用MySQL的Java Web应用程序。在Web应用程序日志中,它显示以下消息:

Error querying database.  Cause: java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" 
to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.

在这个论坛上,我看到了一个解决方案,我不得不添加GRANT SELECT ON mysql.proc TO webapp@'%';来解决这个问题。问题是我认为这个解决方案是侵入性的,因为我允许访问从数据库到webapp用户的每个过程。为什么添加bdwebapp.*上的所有权限到webapp@'%'还不够呢?以便从Web应用程序执行存储过程?
当Web应用程序调用过程时,我看到问题出现了。即使如此,如果我用mysql shell执行:call sp_getClientByCode(1);它给出没有GRANT SELECT ON mysql.proc TO webapp@'%'的结果。
这是在调用存储过程时使用mybatis的Java指令。

@Select("{call sp_getClientByCode(#{clientId, mode=IN, jdbcType=INTEGER})}")
@Options(statementType = StatementType.CALLABLE)
List<App> getClientByCode(@Param("clientId") Integer userId);

这是程序实作:

CREATE DEFINER=`webapp`@`%` PROCEDURE `sp_getClientByCode`(clientId INT)
BEGIN
    SELECT id, name FROM clients where id = clientId;
END
oo7oh9g9

oo7oh9g91#

java连接器正在尝试独立于mybatis声明来验证存储过程的参数类型。
您可以像错误消息所建议的那样应用noAccessToProcedureBodies=true
但是,更好的解决方案是使用MariaDB Connector/J,它使用MariaDB unprivileged operation(使用information_schema.parameters)来检查存储过程的参数。

相关问题