我花了几个月的时间开发一个带有 Oracle 数据库后端的 JAVA 应用程序。我在笔记本电脑上使用 Netbeans 作为我的 IDE,并使用 Oracle 12c 作为我的数据库。所有 PL/SQL 都已编译,没有错误。
经过大量测试(以架构所有者身份登录)后,我尝试添加一个用户。我创建了用户,以 SYS_DBA 身份登录,使用 CREATE USER E566299 IDENTIFIED BY tempPswrd
,然后使用 GRANT CREATE SESSION
和 GRANT EXECUTE ON C##FAI_CODE 授予权限。 FAI_ADMIN_PKG TO E566299
并收到 Grant succeeded
确认。
我作为这个新用户登录到我的应用程序,使用以下命令没有错误:
private static Connection getDbConn(String user, String password) throws SQLException{
OracleDataSource ods = null;
Connection dbConn = null;
user = "c##" + user;
ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:1522/orcl.global.ds.XXXXXXXX.com");
ods.setUser(user);
ods.setPassword(password);
dbConn = ods.getConnection();
return dbConn;
}
然后它在第一个包过程调用时抛出一个错误:
java.sql.SQLException: ORA-06550: line 1, column 13: PLS-00201: identifier 'FAI_ADMIN_PKG.CHECK_USER_FOLLOWED' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3923) at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385) at faidb.FAIdb.checkSubscription(FAIdb.java:549) at faidb.faidbUI.run(faidbUI.java:186) at faidb.faidbLogin$3.run(faidbLogin.java:133) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
我不知所措,我尝试了所有可能的授权措辞组合,全部大写,全部小写,单引号,双引号,模式所有者名称前缀 C##FAI_CODE.FAI_ADMIN_PKG
,没有 FAI_ADMIN_PKG
,这个新用户将无法执行包。
我在这个项目上花费了相当多的时间,并且几乎 panic ,因为没有人能够使用它。
问题:
为什么我新创建的用户被授予权限后不能执行包?
编辑:
我在调用 rset.close();
的最后一行得到一个 NullPointerException
,结果集从未被初始化,但它不会抛出一个 SQLException
public Vector<String> fillBox() throws SQLException, NullPointerException{
CallableStatement callStatement = null;
ResultSet rset = null;
String fillBox = "{call fai_admin_pkg.get_end_item_pn(?)}";
Vector<String> boxFill = new Vector<>();
try{
callStatement = conn.prepareCall(fillBox);
callStatement.registerOutParameter(1, OracleTypes.CURSOR);
callStatement.execute();
rset = (ResultSet) callStatement.getObject(1);
boxFill = buildRsVector(rset);
}
finally{
callStatement.close();
rset.close();
}
return boxFill;
}
这里调用的是:
Vector<String> boxFill = new Vector<>();
try{
boxFill = uiInst.fillBox();
}catch(SQLException e){
JOptionPane.showMessageDialog(frame, e.getMessage());
}catch(NullPointerException e){
JOptionPane.showMessageDialog(frame, e.getMessage());
e.printStackTrace();
}
这是我作为新用户的权限...其中不包括对程序包执行?我不理解
最佳答案
问题解决了。没有全局同义词集或 current_schema
将新用户的 session 设置为包所有者会导致对需要所有者前缀的所有者包过程的任何调用:<package owner>.<package>.<procedure>
.我在新用户下打的电话只打给了<package>.<procedure>
导致 SQLException
被抛出是因为编译器认为该包不存在。
此外,我将研究全局同义词和用户 session 以避免必须使用此快速修复。
感谢您的帮助!
关于java.sql.SQLException : ORA-06550: line 1, 第 13 列:授予用户对 EXECUTE 包的权限后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249225/