JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to deter
执行存储过程时,出现如下错误:
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:1616)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4009)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:702)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4536)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4610)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4584)
经过查阅资料得知,JDBC在调用存储过程时不光用户要有execute的权限,还需要对mysql.proc具有访问权限。否则它无法访问metadata。有两种解决方法:
一.给数据库连接设置一个noAccessToProcedureBodies属性,属性值为true,示例如下:
- jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true
网上说设置noAccessToProcedureBodies=true会带来一些影响(未经考证):
1. 调用存储过程时,将没有类型检查,设为字符串类型,并且所有的参数设为int类型,但是在调用registerOutParameter时,不抛出异常。
2. 存储过程的查询结果无法使用getXXX(String parameterName)的形式获取,只能通过getXXX(int parameterIndex)的方式获取。
二.给数据库用户赋权,赋执行mysql.proc表的select权限,示例如下:
- GRANT SELECT ON mysql.proc TO 'user'@'localhost';
相关推荐
在实际应用中,我们需要确保安全性和权限控制,因为允许存储过程直接调用操作系统命令可能存在安全风险。因此,通常只会在受信任的环境中,并且在严格控制权限的情况下使用这种方法。同时,对存储过程进行充分的测试...
* 提高数据安全性:使用存储过程可以提高数据安全性,因为存储过程可以控制数据的访问权限。 * 提高数据可靠性:使用存储过程可以提高数据可靠性,因为存储过程可以确保数据的一致性。 Informatica 调用存储过程的...
### Ibatis调用存储过程详解 #### 一、引言 在实际的软件开发过程中,存储过程因其执行效率高及数据库级别的安全性等优点被广泛应用于各种业务场景之中。而对于使用Ibatis作为持久层框架的应用来说,如何有效地...
3. **安全性**:通过权限控制,可以限制用户对数据库表的直接访问,仅允许他们调用存储过程,从而降低数据被误操作的风险。 4. **简化复杂操作**:存储过程可以处理复杂的业务逻辑,包括多表操作、条件判断、循环等...
1. 对存储过程的调用(CALL)权限; 2. 对存储过程访问的对象(如表或视图)的SELECT权限; 3. 存储过程的DEBUG权限。 开发者可以通过在SAP HANA Studio的Object Privileges下勾选DEBUG权限,或者直接使用SQL语句...
在数据库管理中,存储过程(Stored Procedure)是一种预编译的SQL代码集合,它封装了特定的功能,并在需要时由应用程序调用执行。存储过程在大型数据库系统中扮演着重要角色,因为它能提高性能、增强安全性、减少...
此外,存储过程可以设置权限,增强数据库的安全性,并且易于维护,因为更改存储过程不会影响到使用它的应用程序。 2. 调用存储过程的方法: - MySQL:在MySQL中,可以使用`CALL`语句来调用存储过程。例如,假设有...
- **安全性**:通过权限控制,可以限制对特定存储过程的访问,而不是直接访问底层数据。 - **减少网络流量**:调用存储过程比多次发送单独的SQL语句更高效,因为存储过程的调用只需要一个请求。 2. **在应用程序...
调用Oracle存储过程是数据库管理中的常见任务,尤其对于需要执行大量数据处理或事务操作的场景。下面我们将详细探讨如何在Oracle中调用存储过程以及其相关知识点。 1. **创建存储过程**: 在Oracle中,你可以使用`...
存储过程的主要优点包括:提高性能(因为预编译后减少了解析时间)、提高安全(可以通过权限控制访问)、降低网络流量(只需传输存储过程名和参数,而不是完整的SQL语句)。 3. MyBatis调用存储过程的基本步骤 (1...
- 安全性:可以控制对存储过程的访问权限,比直接访问表更安全。 - 减少网络流量:存储过程调用比多次单独的SQL执行更高效,减少数据传输量。 - 业务逻辑封装:将复杂的业务逻辑放在数据库端,便于管理和维护。 ...
**Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的程序单元。它可以包含一系列SQL语句和控制流语句,用于执行复杂的操作。存储过程的主要优势在于它们能够提高应用性能、减少网络流量,并提供更高...
存储过程是预编译的SQL和PL/SQL语句集合,它们存储在数据库中并可以被调用执行。通过存储过程,我们可以封装复杂的业务逻辑,提高代码复用性和执行效率。 在Oracle中,访问接口通常需要使用UTL_HTTP或者DBMS_HTTP包...
- 注意存储过程的权限问题,确保执行用户具有调用该存储过程的权限。 - 对于Oracle等数据库,可能需要使用`{call ...}`而非`call ...`,具体语法取决于所使用的数据库系统。 通过以上步骤,你可以成功地在MyBatis...
2. **安全机制**:即使用户没有直接访问某些表或视图的权限,也可能通过执行存储过程间接访问到这些资源,从而实现更细粒度的安全控制。 3. **执行速度**:由于存储过程预编译的特点,其执行效率远高于动态SQL。 4. ...
8. **安全性**:确保job和存储过程的访问权限设置合理,防止未授权的访问和操作。 通过以上讨论,我们可以看出"job调用的存储过程"在数据库管理和数据处理中的重要性,它使得复杂的数据操作和维护任务得以自动化,...
- **安全性**:通过授予用户执行存储过程的权限而不是直接访问表的权限,可以更好地控制数据访问。 - **性能提升**:预编译后的存储过程在首次执行后会被缓存,后续执行时可以直接从缓存中加载,提高执行速度。 - **...
### C# 调用存储过程详解 #### 一、背景介绍 在现代软件开发过程中,数据库操作是非常重要的一部分。为了提高数据访问层的性能、安全性和可维护性,存储过程成为了开发人员常用的一种手段。存储过程是预编译好的...
在数据库管理领域,SQL(Structured Query Language)存储过程是一种预编译的SQL代码集合,它封装了一系列复杂的数据库操作,可以在需要时重复调用,提高了代码的重用性和执行效率。本资源主要关注“SQL存储过程的...