JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

执行存储过程时,出现如下错误:

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.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1616)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4009)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:702)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4536)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4610)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4584)

经过查阅资料得知,JDBC在调用存储过程时不光用户要有execute的权限,还需要对mysql.proc具有访问权限。否则它无法访问metadata。有两种解决方法:

 

一.给数据库连接设置一个noAccessToProcedureBodies属性,属性值为true,示例如下:

 

Xml代码  

  1. jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true  

 

 网上说设置noAccessToProcedureBodies=true会带来一些影响(未经考证):

 

1. 调用存储过程时,将没有类型检查,设为字符串类型,并且所有的参数设为int类型,但是在调用registerOutParameter时,不抛出异常。

2. 存储过程的查询结果无法使用getXXX(String parameterName)的形式获取,只能通过getXXX(int parameterIndex)的方式获取。

 

 

二.给数据库用户赋权,赋执行mysql.proc表的select权限,示例如下:

 

Sql代码  

  1. GRANT SELECT ON mysql.proc TO 'user'@'localhost';  

 

 

参考资料:

  1. http://stackoverflow.com/questions/986628/mysql-java-cant-execute-stored-procedure
  2. http://space.itpub.net/18945822/viewspace-683363
  3. http://cau99.blog.51cto.com/1855224/348792

 

时间: 2024-08-01 16:28:51

JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,的相关文章

mysql数据库报如下错误,跪求解决

问题描述 mysql数据库报如下错误,跪求解决 --- The error happened while setting a property on the result object. --- Cause: com.ibatis.common.beans.ProbeException: Could not get property 'dynamicFields' from com.aspire.ess.domain.Accounts. Cause: java.lang.ClassCastExc

mysql c# 存储过程-C#调用MySql存储过程报错,请各位帮忙解答一下

问题描述 C#调用MySql存储过程报错,请各位帮忙解答一下 public DataSet GetPagerList(string tableName, string primaryKey, string columns, string whereSql, string sortField, int? pageSize, int? currPage, bool isDesc) { MySqlParameter[] param = new MySqlParameter[]{ new MySqlPa

解决远程登录mysql数据库报1130错误

现象:安装好mysql后,发现phpmyadmin不能登录mysql,返回1130错误,但是在mysql命令行登录mysql -u root -p可以 分析过程及解决方案: 百度查询mysql的1130错误是远程连接的用户无远程权限问题导致.解决方案:在本机登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称'%'. mysql -u root -p mysq

创建mysql存储过程出现1307错误

先测试一下  代码如下 复制代码 create procedure test1(in a int) //create创建:procedure存储过程:test1是存储过程名还管有没有参数都得加上() begin //开始 select * from test where id=a;//这里是存储过程的语句 end;//结束 //注:用mysql创建必须把Delimiter改为// 创建成功了,代表数据库是没有问题的可以正常创建存储过程,但在导入时发生问题了,下面接着百度 创建的时候出现了1307

vb.net通过web References执行mysql存储过程的问题?求助高手???

问题描述 我的Web端是Php,连接数据都是在php页面中.本地端执行Sql语句的代码如下,但以下代码只能执行Insert语句,不能执行存储过程,请问怎么修改可以执行存储过程???PublicOverloadsSubInsertData(ByValaTblAsString)TryDimvReaderAsXml.XmlReaderMe.Clear(False)Me.gDb.DataSet=NewData.DataSetMe.gVar.Str=Me.gVar.Str.Substring(0,Me.g

websphere服务器执行db2存储过程报错

问题描述 was不能执行db2的存储过程,用tomcat服务器可以执行.同样was可以执行oracle的存储过程.错误见图 解决方案

mysql启动错误之mysql启动报1067错误解决方法_Mysql

解决方案: 1.在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,还是启动不了或者能启动但关机后又出现同样问题,接着我做了第二步,重启正常. 2.删除DATA目录下除数据库文件夹外的其他文件,重启mysql,问题解决.

MySQL 存储过程初研究

最近在做一个移动设备多类型登录的统一用户系统.其中记录用户资料的部分,因为涉及到更换设备的相同用户.同一个用户多类型同时具备的情况,所以想分辨出尽量少的用户去合理记录,就需要多次查询.于是决定研究一下 MySQL 存储程序. MySQL 现在是 5.5 或者 5.6 .因为存储程序是 5.x 才具备的特性,所以放弃了具有中文文档的 5.1 ,选择可能会修改了很多问题的 5.5 .可惜这就造成我不得不去看在线英文文档,因为我实在找不到 MySQL 5.5 的 PDF 版中文文档-- 在线文档地址是

MySQL存储过程、函数、触发器和视图的权限检查

当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将检查创建者的权限.假设用户A创建了存储过程p()访问表T,并把execute的权限赋给了B,即使用户B没有访问表T的权限,也能够通过执行存储过程p()访问表T. 下面看一个例子: 首先,我们创建一个表test.t和两个用户a,b,并把权限赋予用户a root@(none) 05:39:45>crea