【问题标题】:Can't execute a MySQL stored procedure from Java无法从 Java 执行 MySQL 存储过程
【发布时间】:2010-11-02 11:10:11
【问题描述】:

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

在机器上安装mysql之后。我已将以下授权选项授予 root

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

在java类中..

我连接到数据库如下:

String url = "jdbc:mysql://ipaddress:3306/test";
                con = DriverManager.getConnection(url,"root", "pass");

我还尝试了包含noAccessToProcedureBodies=true 选项的网址。

谁能告诉我这里出了什么问题?有什么需要检查的吗?

【问题讨论】:

  • 对不起,授权应该是 . 而不是 .
  • 我认为 MySQL 的 GRANT 并不总是像您预期的那样工作。我有时会发现,如果您使用特定的 GRANT 权限而不是 .,事情会奏效

标签: java mysql stored-procedures privileges


【解决方案1】:

有两种方法可以解决这个问题:

  1. 设置连接的noAccessToProcedureBodies=true 属性

    例如作为连接字符串的一部分:

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

    然后,JDBC 驱动程序将为参数创建“INOUT”字符串,而无需像异常所说的那样需要元数据。

  2. mysql.procSELECT 权限授予数据库用户

    例如在mysql提示符中:

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

    当然,这将允许应用程序读取整个mysql.proc 表,该表包含有关所有数据库中所有存储过程的信息(包括源代码)。

【讨论】:

  • 这(和stackoverflow.com/q/1880461/7708)是我不喜欢使用 MySQL 的例子。
  • @Kush:根据我的特殊经验,Connector/J 5.1.12 似乎不知道 noAccessToProcedureBodies 参数;最新的(当前)5.1.x 版本,即 5.1.26 版本,已经意识到了这一点。希望这会有所帮助。
  • 第一个选项对我有用。我正在使用 JDBC MySQL 连接器驱动程序,5.1.30 版本
  • 与其授予“mysql.proc”,为什么不授予“schema.proc”,其中schema是您的数据库架构?
  • 如果您从远程主机访问 mysql 服务器,请使用 GRANT SELECT ON mysql.proc TO 'user'@'%';
【解决方案2】:

以下步骤在 mysql 中对我有用

第 1 步:添加 follwong
连接 con = DriverManager.getConnection("jdbc:mysql://ipaddress:3306/logparser?noAccessToProcedureBodies = true ", “根”, ””);

第 2 步: 将所有logparser.proc 授予root@'%';其中 logparser 是 DB 名称,proc 是过程名称。

【讨论】:

    【解决方案3】:

    在下面运行查询应该可以解决您的问题。

    GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%';
    FLUSH PRIVILEGES;
    

    【讨论】:

      【解决方案4】:

      您可以将 mysql.proc 表中的定义者更改为您的数据库用户。

      从 mysql.proc 中选择 *;

      选择有问题的存储过程并将定义器更改为'yourdbuser'@'localhost'。

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 2012-07-02
        • 1970-01-01
        • 2012-10-24
        • 2023-03-30
        • 2016-10-11
        相关资源
        最近更新 更多