繁体   English   中英

java.sql.SQLException:ORA-06550:第1行第13列:授予用户对EXECUTE包的权限后

[英]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 SESSIONGRANT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM