Я исследовал здесь и в других местах, но не нашел ответа на следующее.Oracle PL/SQL: Получить список разрешенных процедур для учетной записи
Я хотел бы получить список всех доступных процедур на счет Oracle моего приложения (AFAIK они являются частью одного пакета), и попробовал следующую команду в SQLPLUS:
SELECT * from user_procedures;
Однако это возвращает только одну строку/процедуру, когда на самом деле приложение имеет, вероятно, 20+ процедур, которые он вызывает (успешно) на регулярной основе. Я могу просто просмотреть исходный код и извлечь все имена хранимых процедур, но я бы хотел использовать вышеописанное и посмотреть, как он работает, и в качестве основы для дальнейшего изучения db, чтобы помочь в отладке (вместо того, чтобы всегда требовать например, запустить приложение или написать тестовый клиентский код).
Выполняет ли приведенный выше оператор только процедуры возврата, которыми владеет моя учетная запись, или она должна показывать что-либо доступ к учетной записи? [Я не очень хорошо знаком с особенностями Oracle.]
Я пробовал другие варианты; например, ссылаясь на результаты «dba_procedures» в «таблице или представлении, не существует ошибки».
Являются ли все эти симптомы результатом ограниченных разрешений для учетной записи Oracle моего приложения (которую я использую для подключения через sqlplus)?
[Исходная информация: Дисфункциональная среда - прямой доступ к СУБД и ее внешним владельцам крайне ограничен, поэтому я хотел бы иметь возможность увеличить свое понимание дизайна db и получить необходимую информацию без помощи.]
Alex: Спасибо, и работа, и ситуация, как вы описали. Я запускал «desc» в соответствующем пакете, spool'd вывод в файл и получил именно то, что я искал: список связанных хранимых procs и их параметров. 'desc (имя_пакета)' было ключом. –
Я уверен, что ответ Алекса неполный; например, любые процедуры, которые вы унаследовали, привилегия выполнения не включались. Если один не имеет SELECT словарях привилегию (и даже не то, как я подозреваю), ВЫБРАТЬ ВЛАДЕЛЕЦ, OBJECT_TYPE, OBJECT_NAME ОТ ALL_OBJECTS WHERE OBJECT_TYPE IN ('ПАКЕТ', 'ПОРЯДКЕ', 'функция') Единственный грант, который я могу представить, может быть применим к любому из этих типов объектов: EXECUTE; SELECT, INSERT, UPDATE, DELETE и REFERENCES не имеют смысла. –
'ALL_OBJECTS' будет содержать все, что вы можете видеть; вы можете отказаться от пакетов, которые вы не можете, если у вас нет 'EXECUTE', хотя я точно не знаю, когда это может произойти. Вы правы, однако, он не видит привилегированных, предоставляемых через роли (в том числе 'PUBLIC'); вы можете получить их из all_tab_privs: выберите ao.object_type, ao.owner || '.' || ao.object_name от ALL_OBJECTS ао, all_tab_privs АТП , где ao.object_type в ('ПАКЕТ', ПРОЦЕДУРЫ», 'FUNCTION') и atp.schema_name = ao.owner и atp.table_name = ao.object_name и АТП. privilege = 'EXECUTE'; –