web-dev-qa-db-ja.com

JavaからMySQLストアドプロシージャを実行できません。

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オプションを含めてURLを試しました。

誰かがここで何が悪いのか教えてもらえますか?確認する必要があるものはありますか?

27
CGP

これを解決するには2つの方法があります。

  1. 接続のnoAccessToProcedureBodies=trueプロパティを設定する

    たとえば、接続文字列の一部として:

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

    次に、JDBCドライバーは、例外が言うようにメタデータを必要とせずに、引数の「INOUT」文字列を作成します。

  2. mysql.procに対するSELECT特権をデータベースユーザーに付与します

    たとえば、mysqlプロンプトでは次のようになります。

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

    もちろん、これにより、アプリケーションはallストアドプロシージャに関する情報を含むmysql.procテーブル全体をallデータベース(ソースコードを含む)。

64
Josef Pfleger

次の手順はmysqlで私のために働きました

ステップ1:follwongを追加する
接続con = DriverManager.getConnection( "jdbc:mysql:// ipaddress:3306/logparser?noAccessToProcedureBodies = true"、 "root"、 "");

ステップ2:すべてをGRANT ON logparser.proc TO root @ '%';ここで、logparserはDB名で、procはプロシージャ名です。

2
Vijay Bhatt

以下のクエリを実行すると、問題が解決するはずです。

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

Mysql.procテーブルの定義者をデータベースユーザーに変更できます。

mysql.procから*を選択します。

問題のあるストアドプロシージャを選択し、定義者を 'yourdbuser' @ 'localhost'に変更します。

0
Akshaya