我有一个使用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
1条答案
按热度按时间oo7oh9g91#
java连接器正在尝试独立于mybatis声明来验证存储过程的参数类型。
您可以像错误消息所建议的那样应用
noAccessToProcedureBodies=true
。但是,更好的解决方案是使用MariaDB Connector/J,它使用MariaDB unprivileged operation(使用information_schema.parameters)来检查存储过程的参数。