[英]java.sql.SQLException: ORA-06550: line 1, column 13: After granting user permission to EXECUTE package
我花了几个月的时间用Oracle db后端开发一个JAVA应用程序。 我在笔记本电脑上使用Netbeans作为我的IDE和Oracle 12c作为我的数据库。 所有PL / SQL都已编译,没有错误。
经过大量测试(以架构所有者身份登录)后,我尝试添加用户。 我使用CREATE USER E566299 IDENTIFIED BY tempPswrd
创建了用户,以SYS_DBA身份登录,然后使用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:第1行第13列:PLS-00201:必须声明标识符'FAI_ADMIN_PKG.CHECK_USER_FOLLOWED'ORA-06550:第1行第7列:PL / SQL:语句被忽略
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) )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)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.OraclePreparedStatement.exe(OraclePreparedStatement。 java:3923)在oracle.jdbc.dri的oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617) ver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)at faidb.FAIdb.checkSubscription(FAIdb.java:549)at faidb.faidbUI.run(faidbUI.java:186)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
,什么都不会允许这个新的用户执行包。
我花了相当多的时间在这个项目上,并且几乎没有人能够使用它。
题:
为什么我的新创建的用户在被授予权限后不能执行包?
编辑:
我通过调用rset.close();
在最后一行得到一个NullPointerException
rset.close();
,结果集永远不会初始化,但它不会抛出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
,则会导致对所有者包过程的任何调用都需要所有者的前缀: <package owner>.<package>.<procedure>
。 我在新用户下进行的调用只是<package>.<procedure>
导致SQLException
,因为编译器不存在该包。
此外,我将研究全局同义词和用户会话,以避免使用此快速修复。
谢谢您的帮助!
create session只允许您登录数据库。 你可能需要其他人的许可来做你想做的事。
您可以参考此链接获取帮助
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljgrant.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.