Швидше за все на чужій об'єкт є привілей, видана тільки через роль. Для використання об'єктів іншого користувача або системних привілеїв в своїх процедурах / триггерах і т.д. а також в job-ах необхідно дати на них привілей безпосередньо, не через роль.
Так само це правило слід врахувати для динамічного SQL:
використовувана версія
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL / SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
Проблема пов'язана з тим, що якщо процедура створюється як співається на правах її творця, то привілеї необхідні для виконанню команд динамічного SQL повинні бути дані творцеві явно а не через роль. Дуже важливий момент, мова йде не про привілеї на виконання процедури, а про привілеї, необхідних для виконання команд динамічного SQL.
1) Створюємо користувача
Заходимо під цим користувачем
-- переконуємося що користувач має право створювати таблицю
Дуже часто розробники ламають голову, чому, якщо я створюю таблицю в sqlplus
або динамічно в анонімному блоці, то все в порядку, однак якщо я це роблю в
процедурі, то отримую помилку ORA-01031: insufficient privileges. Ось відповідь на
це питання. При використанні анонімного блоку ситуація інша. Анонімний блок
виконується на правах виконуючого, тому привілеї, дані через роль,
діють!
Використання динамічного SQL в тригерах
Тригер виконується на правах його творця, а НЕ на правах користувача, що викликав його спрацьовування. Таким чином вищесказане поширюється і на динамічний SQL в тригерах - необхідні привілеї повинні бути дані явно, а не через роль.