Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从Java执行MySQL存储过程_Java_Mysql_Stored Procedures_Privileges - Fatal编程技术网

无法从Java执行MySQL存储过程

无法从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

我正在从运行在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.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;