无法从Java执行MySQL存储过程
我正在从运行在tomcat中的web应用程序连接到运行在linux机器上的MySQL 5.08数据库 当我尝试执行存储过程时,出现以下异常:无法从Java执行MySQL存储过程,java,mysql,stored-procedures,privileges,Java,Mysql,Stored Procedures,Privileges,我正在从运行在tomcat中的web应用程序连接到运行在linux机器上的MySQL 5.08数据库 当我尝试执行存储过程时,出现以下异常: com.hp.hpl.chaos.web.exception.DBException: getNextValue for operatorinstance[Additional Information from SQL Exception][SQLErrorCode: 0 SQLState: S1000 at com.hp.hpl.chaos.we
com.hp.hpl.chaos.web.exception.DBException: getNextValue for operatorinstance[Additional Information from SQL Exception][SQLErrorCode: 0 SQLState: S1000
at com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:207)
..............
Caused by: 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:1619)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4034)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:709)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4583)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4657)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4631)
at com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:196)
... 17 more
在java类中
我正在连接数据库,如下所示:
String url = "jdbc:mysql://ipaddress:3306/test";
con = DriverManager.getConnection(url,"root", "pass");
我还尝试了包含noAccessToProcedureBodies=true选项的url
有人能告诉我这里怎么了吗?有什么我需要检查的吗?有两种方法可以解决这个问题: 设置连接的NoAccessTopProcedureBodies=true属性 例如,作为连接字符串的一部分:
jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true
JDBC驱动程序随后将为参数创建INOUT字符串,而不需要元数据,如异常所述
将mysql.proc上的SELECT权限授予数据库用户
例如,在mysql提示符中:
GRANT SELECT ON mysql.proc TO 'user'@'localhost';
当然,这将允许应用程序读取整个mysql.proc表,该表包含所有数据库(包括源代码)中所有存储过程的信息
在mysql中,以下步骤对我有效 步骤1:添加以下内容 Connection con=DriverManager.getConnectionjdbc:mysql://ipaddress:3306/logparser?noAccessToProcedureBodies =正确, 根 步骤2:
将logparser.proc上的所有权限授予根@“%”;其中logparser是DB name,proc是procedure name。运行下面的查询应该可以解决您的问题
GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%';
FLUSH PRIVILEGES;
您可以将mysql.proc表中的定义者更改为您的数据库用户 从mysql.proc中选择*
选择有问题的存储进程,并将定义者更改为“yourdbuser”@“localhost”。很抱歉,授权应为。相反,我认为MySQL的资助并不总是像你预期的那样有效。我有时发现,如果您使用特定的授予权限而不是授予权限,事情就会发生。这就是我不喜欢使用MySQL的原因。@Kush:根据我的经验,Connector/J 5.1.12似乎不知道noAccessToProcedureBodies参数;目前最新的5.1.x版本,即5.1.26版本,已经意识到了这一点。希望这对我有帮助。第一种选择对我很有效。我使用的是JDBC MySQL连接器驱动程序,5.1.30版本,而不是在MySQL.proc上授予权限,为什么不在schema.proc上授予权限,其中schema是您的db schema?如果您从远程主机访问MySQL服务器,请使用在MySQL.proc上授予SELECT到“user”@“%”;
GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%';
FLUSH PRIVILEGES;