簡體   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