SpringBoot+Hibernate+MySQL下SQLGrammarException:权限问题排查
问题分析与解决
核心错误原因
从堆栈最底层的异常信息可以直接定位问题:
用户'myuser'@'something'被拒绝对表'mytable'执行INSERT、UPDATE命令
这不是SQL语法错误(虽然外层抛出了SQLGrammarException,但实际是MySQL把权限错误归类到了语法错误类型中),也不是Spring/Hibernate的配置问题,本质是数据库账号权限不足。
你的代码与SQL本身无问题
你的SQL语句和Repository方法写法完全合规:
String INSERT = "INSERT IGNORE INTO mydb.mytable (event_id, last_update, last_table_updated, deleted)" + " VALUES (:id, NOW(), 'event', 'Y')" + " ON DUPLICATE KEY UPDATE last_update=values(last_update), last_table_updated=VALUES(last_table_updated), deleted=VALUES(deleted)"; @Transactional @Modifying @Query(value = INSERT, nativeQuery = true) void insert(@Param("id") String id);
INSERT IGNORE + ON DUPLICATE KEY UPDATE的逻辑符合MySQL语法规范- Repository上的注解(
@Transactional、@Modifying、@Query(nativeQuery=true))用法正确
解决步骤
给数据库账号授权
登录MySQL服务器,执行授权语句:-- 仅授予目标表的INSERT和UPDATE权限 GRANT INSERT, UPDATE ON mydb.mytable TO 'myuser'@'something'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;如果需要该账号操作库下所有表,可改用:
GRANT INSERT, UPDATE ON mydb.* TO 'myuser'@'something'; FLUSH PRIVILEGES;验证权限是否生效
使用该账号登录MySQL,执行命令查看权限:SHOW GRANTS FOR 'myuser'@'something';输出结果中应包含
INSERT, UPDATE ONmydb.mytable``相关的权限条目。
补充说明
MySQL错误码1142对应的就是权限拒绝错误,外层的SQLGrammarException是Hibernate对MySQL错误类型的转换导致的误导,实际根源和SQL语法、Spring配置无关。
内容的提问来源于stack exchange,提问作者Sachin Kainth
相关产品推荐
相关产品推荐

