java.sql.SQLException: ORA-06550: строка 1, столбец 13: после предоставления пользователю разрешения на пакет EXECUTE

Я потратил несколько месяцев на разработку приложения JAVA с серверной частью Oracle db. Я использую 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: строка 1, столбец 13: PLS-00201: идентификатор FAI_ADMIN_PKG.CHECK_USER_FOLLOWED должен быть объявлен ORA-06550: строка 1, столбец 7: PL / SQL: инструкция игнорируется

в oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:450) в oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:399) в oracle.jdbc.driver.T4C8ror10all.process ) на oracle.jdbc.driver.T4CTTIfun.receive (T4CTTIfun.java:655) на oracle.jdbc.driver.T4CTTIfun.doRPC (T4CTTIfun.java:249) на oracle.jdbc.driver.T4C8Oall.doOall (T4C8Oall.doOALL. 566) на oracle.jdbc.driver.T4CCallableStatement.doOall8 (T4CCallableStatement.java:210) в oracle.jdbc.driver.T4CCallableStatement.doOall8 (T4CCallableStatement.java:53) в oracle.jdbc.driver.CCallableStatement.java:53) в oracle.jdbc..exe : 938) на oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1075) на oracle.jdbc.driver.OraclePreparedStatement.executeInternal (OraclePreparedStatement.java:3820) в oracle.jdbc.driver. Java: 392 3) на oracle.jdbc.driver.OracleCallableStatement.execute (OracleCallableStatement.java:5617) на oracle.jdbc.driver.OraclePreparedStatementWrapper.execute (OraclePreparedStatementWrapper.java:1385) на faidcheck5dubscription (FAIdcheck5.FAIdb) faidb.faidbUI.run (faidbUI.java:186) в faidb.faidbLogin $ 3.run (faidbLogin.java:133) в java.awt.event.InvocationEvent.dispatch (InvocationEvent.java:311)

Я в растерянности, я пробовал все возможные комбинации формулировок гранта, все заглавные буквы, все строчные буквы, одинарные кавычки, двойные кавычки, с префиксом имени владельца схемы C##FAI_CODE.FAI_ADMIN_PKG, без FAI_ADMIN_PKG, ничто не позволит этому новому пользователю выполнить упаковка.

Я потратил много времени на этот проект и близок к панике из-за того, что никто не сможет его использовать.

Вопрос:

Почему мой недавно созданный пользователь не может выполнить пакет после получения разрешения?

Редактировать:

Я получаю 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();
            }

Вот мои разрешения как нового пользователя ... которые не включают выполнение в пакете ?? Я не понимаю нет разрешения после предоставления


person corporateWhore    schedule 14.05.2015    source источник
comment
Можете ли вы выполнить все действия в SQL * Plus и опубликовать здесь результаты? Это поможет исключить любые проблемы с Java.   -  person Jon Heller    schedule 15.05.2015
comment
Я создал пользователя и предоставил разрешения в SQL plus. Все генерируемые исключения из sql, поэтому я предположил, что это проблема с базой данных. Я отлаживал свой java-код, чтобы точно определить, в чем проблема.   -  person corporateWhore    schedule 15.05.2015
comment
Выбрасывается при первом вызове пакетной процедуры.   -  person corporateWhore    schedule 15.05.2015
comment
Пример рабочего вызова из SQL * Plus, входящего в систему как новый пользователь, безусловно, поможет. Как и фактический код Java, который вы используете для вызова процедуры (или функции?). Тот факт, что Oracle настоятельно не рекомендует использовать знак # в идентификаторах без кавычек docs.oracle.com/cd/B19306_01/server.102/b14200/ делает выбор имени пользователя проблематичным. Публикация результатов запроса dba_source для конкретных object_name, owner и procedure_name может помочь показать, как на самом деле создаются идентификаторы.   -  person Justin Cave    schedule 15.05.2015
comment
Опубликованный вами код потенциально будет работать только в том случае, если вы вошли в схему, которой принадлежал пакет, или если вы установили current_schema для сеанса для владельца пакета или если у вас был локальный или глобальный синоним для пакета. У вас есть какие-нибудь из этих вещей? Если нет, вам понадобится включить префикс схемы. Если вы внесете это изменение, оно, вероятно, как минимум исправит сообщение об ошибке. Затем опубликуйте dba_procedure информацию (извините, не dba_source, с моей стороны мозги пердят).   -  person Justin Cave    schedule 15.05.2015
comment
под префиксом схемы вы подразумеваете владельца? Например: c ## fai_code.fai_admin_pkg. ‹Имя процедуры›?   -  person corporateWhore    schedule 15.05.2015
comment
если вы установили current_schema для сеанса на владельца пакета или если у вас был локальный или глобальный синоним для пакета. Знаете ли вы учебник для этого? Дайте мне знать, если я на правильном пути; если я хочу иметь доступ к этому пакету с пользователем, отличным от владельца, мне нужно префикс ВСЕХ вызовов процедур с именем владельца пакета?   -  person corporateWhore    schedule 15.05.2015


Ответы (2)


Задача решена. Отсутствие глобального набора синонимов или current_schema для сеанса нового пользователя, установленного для владельца пакета, приводит к любым вызовам процедур пакета владельцев, требующих префикса владельца: <package owner>.<package>.<procedure>. Вызовы, которые я делал под новым пользователем, касались только <package>.<procedure>, в результате чего было выброшено SQLException, потому что для компилятора этот пакет не существует.

Кроме того, я буду исследовать как глобальные синонимы, так и сеансы пользователей, чтобы не использовать это быстрое исправление.

Спасибо за помощь!

person corporateWhore    schedule 15.05.2015

create session просто позволяет вам войти в базу данных. вам может понадобиться разрешение других делать то, что вы хотите.

вы можете обратиться за помощью по этой ссылке

https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljgrant.html

person Yu Yenkan    schedule 15.05.2015