Почему тип Oracle, созданный одним пользователем, не виден другому пользователю?

У меня есть 2 пользователя в OracleXE DB: ALICE а также BOB, Следующая последовательность шагов успешна на моей локальной машине:

  • подключиться как ALICE
  • создать тип верхнего уровня: create or replace type testtype as object(x number(16)); (РЕДАКТИРОВАТЬ: исправление от неправильного имени foo, которое ввело в заблуждение Мэтью Макпик)
  • подключиться как BOB
  • BOB видит ALICEтип:
    • select * from all_types возвращает строку
    • declare x ALICE.testtype; begin null; end; компилирует

Те же самые шаги, примененные к нашей базе данных разработки, дают в ситуации, когда тип невидим для BOB, т.е. select не возвращает строку для типа, компиляция блока PLSQL завершается неудачно с PLS-00201: identifier 'ALICE.TESTTYPE' must be declared ошибка.

Мне нужно сделать тип видимым, поэтому я спрашиваю: что может вызвать эту разницу? (Я догадывался о некоторой необходимости предоставления грантов для типов или общедоступных синонимов, однако этот минималистический пример доказывает обратное.) Какое свойство пользователя / сеанса? Я сделал все возможное в поиске в Google и застрял сейчас, хотя я надеюсь, что решение будет тривиальным. Обе базы данных - Oracle 11g (11.2.0.1.0 dev, 11.2.0.2.0 local).

Спасибо!

1 ответ

Решение

Я предполагаю, что это больше, чем просто факт, что вы назвали свой тип foo но пытался использовать его как testtype,

Если foo правильное имя, то, как ALICE:

grant execute on foo to bob;

Боб, вероятно, имеет EXECUTE ANY TYPE или аналогичные системные привилегии в 1-й базе данных.

Другие вопросы по тегам