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?
Il y a deux façons de résoudre ce problème:
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.
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).
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.
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;
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'.