Предоставить разрешение UTL_HTTP в PLSQL

Я хотел бы получить HTML-контент с определенной веб-страницы в моей функции. Я читал, что могу сделать это с помощью пакета UTL_HTML в PLSQL. Поэтому я сделал следующий код в проекте:

v_webcontent := utl_http.request(v_weblink);

Здесь v_webconent и v_weblink объявлены ранее. выполнение этого в функции de дает исключение PLSQL: PLS-00201: identifier 'UTL_HTTP' must be declaredЯ думаю, эта проблема связана с тем, что пакет недоступен (по этой ссылке: такое же сообщение об ошибке).

Я последовал совету. Поэтому я создал новое соединение с базой данных в sql-разработчике в качестве роли SYSTEM (SYS не работал, он сказал, что я могу войти в систему только с помощью SYSDBA или SYSOPER, но оба не будут использовать стандартный пароль, который я создал с базой данных). Затем я ввел код по ссылке выше.

GRANT EXECUTE ON SYS.UTL_HTTP TO [database];

Пользователь, которого я создал, называется «База данных». Сначала он дал мне ошибку без квадратных скобок []. Таблица или представление не существуют, поэтому я заключаю их в скобки. Теперь выдает ошибку:

    Error starting at line : 1 in command -
GRANT EXECUTE ON SYS.UTL_HTTP TO [database]
Error report -
SQL Error: ORA-00987: missing or invalid username(s)
00987. 00000 -  "missing or invalid username(s)"
*Cause:    
*Action:

Поэтому я понятия не имею, как это исправить. В приведенной выше ссылке OP сказал, что у него другая ошибка, поэтому я также проверил, не возникла ли у меня такая же проблема. Я вошел:

SELECT * FROM dba_objects WHERE object_name='UTL_HTTP'

Он вернул 4 записи. С владельцами: SYS, SYS, PUBLIC и APEX_040000.

Кто-нибудь может мне помочь? Нужно ли мне входить в систему как SYS и с какими паролями?


person Politiepet    schedule 09.12.2014    source источник


Ответы (2)


  1. Войдите как SYS AS SYSDBA.
  2. Выполните grant execute on sys.utl_http to "Database"; Не используйте квадратные скобки!

Это должно сработать.

Совет: не называйте своего пользователя БД "База данных".


Чтобы сбросить пароль SYS

  1. Запустите cmd.exe от имени администратора.
  2. cd к вашему ${ORACLE_HOME}/database.
  3. Найдите там файл PWDsomething.ora (где something будет именем вашего экземпляра), скопируйте его имя (в буфер обмена).
  4. Запустите orapwd file=PWDsomething.ora password=SomePasswordOfMine force=y, где PWDsomething.ora будет заменено именем файла из шага 3, а SomePasswordOfMine должен быть заменен любым паролем, который вы хотите иметь.

Это может сработать.

person peter.hrasko.sk    schedule 09.12.2014
comment
Я создал нового пользователя с другим именем. Теперь я попытался предоставить разрешение, используя: «предоставить выполнение sys.utl_http моему пользователю;» потому что пользователь, которого я использую, не использовал кавычки. В обоих случаях это дает мне таблицу или представление не существует. Я все еще в системе, потому что я не могу найти пароль для SYSDBA и никогда не устанавливал его, вы знаете, как я могу вернуть туда пароли? - person Politiepet; 09.12.2014
comment
@Politiepet, ответ отредактирован, попробуй. (Мне никогда не приходилось сбрасывать пароль SYS, поэтому не знаю, сработает ли это.) - person peter.hrasko.sk; 09.12.2014
comment
Я уже исправил это. Проблема была не в том, что я не мог войти в SYS. Дело в том, что правильный пароль не работал для SYSDBA в разработчике sql. Так что я сделал на своем компьютере с сервером sql: открыл cmd-тип в «sqlplus / nolog», затем «подключил sys как sysdba», пароль - стандартный пароль. Отсюда я мог запустить «предоставить выполнение sys.utl_http для базы данных»; Это работало таким образом. - person Politiepet; 09.12.2014
comment
Да, sqlplus всегда лучший способ. Это был бы мой следующий совет вам, если смена пароля не сработает для вас. :-) Рад, что помог. - person peter.hrasko.sk; 09.12.2014
comment
Спасибо за помощь :D - person Politiepet; 09.12.2014

Начиная с версии 11g вам также необходимо создать список управления доступом ('ACL'), который указывает, какие пользователи имеют доступ к определенным доменам, больше недостаточно просто предоставить пользователям права выполнения на utl_http!

Что-то вроде этого должно работать в 11g (после предоставления прав на выполнение UTL_HTTP пользователю вашей базы данных, как указано в принятом ответе):

SQL> BEGIN
  2  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl=>'mikesacl.xml',
  3  description=>'access control list example',
  4  principal=>'HR',
  5  is_grant=>TRUE,
  6   privilege=>'connect');
  7  commit;
  8  end;
  9  /

PL/SQL procedure successfully completed.


    SQL> begin
      2  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
      3  acl=>'mikesacl.xml',host=>'*'); 
      4  commit;

      5  end;
      6  /

PL/SQL procedure successfully completed.

Вот очень полезная ссылка, которая объясняет параметры двух вышеупомянутых функций:

http://www.oracleflash.com/36/Oracle-11g-Access-Control-List-for-External-Network-Services.html

Удачи!

person mancini0    schedule 25.01.2016