web-dev-qa-db-fra.com

Impossible d'exécuter une procédure stockée MySQL à partir de Java

Je me connecte à une base de données MySQL (5.08) s'exécutant sur une machine Linux à partir d'une application Web exécutée dans Tomcat.

J'obtiens l'exception suivante lorsque j'essaie d'exécuter une procédure stockée:

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

Après avoir installé mysql sur la machine. J'ai donné les options de subvention suivantes à 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)

Dans la classe Java ..

Je me connecte à la base de données comme suit:

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

J'ai également essayé l'URL avec l'option noAccessToProcedureBodies=true incluse.

Quelqu'un peut-il me dire ce qui ne va pas ici? Dois-je vérifier quelque chose?

27
CGP

Il y a deux façons de résoudre ce problème:

  1. définir la propriété noAccessToProcedureBodies=true de la connexion

    Par exemple, dans le cadre de la chaîne de connexion:

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

    Le pilote JDBC créera ensuite des chaînes "INOUT" pour les arguments sans nécessiter de métadonnées, comme le dit l'exception.

  2. Accorder des privilèges SELECT sur mysql.proc à l'utilisateur de la base de données

    Par exemple, dans l'invite mysql:

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

    Bien entendu, cela permettrait à l'application de lire l'intégralité de la table mysql.proc qui contient des informations sur les procéduresall stockées dansall bases (y compris le code source).

61
Josef Pfleger

Les étapes suivantes ont fonctionné pour moi dans mysql

Étape 1: ajouter follwong
Connection con = DriverManager.getConnection ("jdbc: mysql: // ipaddress: 3306/logparser? NoAccessToProcedureBodies = true", "Root", ""); 

Étape 2: GRANT ALL ON logparser.proc TO root @ '%'; logparser est le nom de la base de données et proc est le nom de la procédure.

2
Vijay Bhatt

Exécuter des requêtes ci-dessous devrait résoudre votre problème.

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

Vous pouvez changer le définisseur de la table mysql.proc en votre utilisateur de base de données.

sélectionnez * depuis mysql.proc;

choisissez le proc stocké qui a le problème et changez le definer en 'yourdbuser' @ 'localhost'.

0
Akshaya