2010-02-12 2 views
3

Я исследовал здесь и в других местах, но не нашел ответа на следующее.Oracle PL/SQL: Получить список разрешенных процедур для учетной записи

Я хотел бы получить список всех доступных процедур на счет Oracle моего приложения (AFAIK они являются частью одного пакета), и попробовал следующую команду в SQLPLUS:

SELECT * from user_procedures; 

Однако это возвращает только одну строку/процедуру, когда на самом деле приложение имеет, вероятно, 20+ процедур, которые он вызывает (успешно) на регулярной основе. Я могу просто просмотреть исходный код и извлечь все имена хранимых процедур, но я бы хотел использовать вышеописанное и посмотреть, как он работает, и в качестве основы для дальнейшего изучения db, чтобы помочь в отладке (вместо того, чтобы всегда требовать например, запустить приложение или написать тестовый клиентский код).

Выполняет ли приведенный выше оператор только процедуры возврата, которыми владеет моя учетная запись, или она должна показывать что-либо доступ к учетной записи? [Я не очень хорошо знаком с особенностями Oracle.]

Я пробовал другие варианты; например, ссылаясь на результаты «dba_procedures» в «таблице или представлении, не существует ошибки».

Являются ли все эти симптомы результатом ограниченных разрешений для учетной записи Oracle моего приложения (которую я использую для подключения через sqlplus)?

[Исходная информация: Дисфункциональная среда - прямой доступ к СУБД и ее внешним владельцам крайне ограничен, поэтому я хотел бы иметь возможность увеличить свое понимание дизайна db и получить необходимую информацию без помощи.]

ответ

4

You можно увидеть, какие автономные процедуры можно выполнить с этим:

select ao.object_type, ao.owner ||'.'|| ao.object_name 
from all_objects ao, user_tab_privs utp 
where ao.object_type = 'PROCEDURE' 
and utp.owner = ao.owner 
and utp.table_name = ao.object_name 
and utp.privilege = 'EXECUTE'; 

но если они находятся в пакете, вы не можете непосредственно видеть имена процедур, AFAIK, но вы можете увидеть, какой пакет вы можете выполнить с этим :

select ao.object_type, ao.owner ||'.'|| ao.object_name 
from all_objects ao, user_tab_privs utp 
where ao.object_type = 'PACKAGE' 
and utp.owner = ao.owner 
and utp.table_name = ao.object_name 
and utp.privilege = 'EXECUTE'; 

И тогда вы можете отправить [ribe] пакет, чтобы увидеть отдельные процедуры и функции внутри него. Я предполагаю, что это, вероятно, содержится где-то в словаре данных, но не knwo, где нет ...

+0

Alex: Спасибо, и работа, и ситуация, как вы описали. Я запускал «desc» в соответствующем пакете, spool'd вывод в файл и получил именно то, что я искал: список связанных хранимых procs и их параметров. 'desc (имя_пакета)' было ключом. –

+1

Я уверен, что ответ Алекса неполный; например, любые процедуры, которые вы унаследовали, привилегия выполнения не включались. Если один не имеет SELECT словарях привилегию (и даже не то, как я подозреваю), ВЫБРАТЬ ВЛАДЕЛЕЦ, OBJECT_TYPE, OBJECT_NAME ОТ ALL_OBJECTS WHERE OBJECT_TYPE IN ('ПАКЕТ', 'ПОРЯДКЕ', 'функция') Единственный грант, который я могу представить, может быть применим к любому из этих типов объектов: EXECUTE; SELECT, INSERT, UPDATE, DELETE и REFERENCES не имеют смысла. –

+0

'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'; –

1

user_procedures - системный вид, который содержит все процедуры, принадлежащие определенной схеме (пользователю). Не те, которые предоставлена ​​схеме (пользователю) для выполнения.

Вы можете попробовать DBMS_METADATA.GET_GRANTED_DDL хранимую процедуру. Вы могли бы найти там что-то полезное. Но я не знаю, какие привилегии вам нужны для запуска в вашем приложении.

Надеюсь, это поможет.

+0

Pablo: Спасибо за ответ. Я закончил разговор desc (ribe) на пакете и получил результат, который я искал. [Это, вероятно, очевидно для любого из вас, знакомых с Oracle!] –

1

Если процедуры являются частью пакета (то есть вы вызываете их PACKNAME.PROCNAME, то у вас есть грант все или ничего на упаковке, а не отдельные процедуры в рамках пакета.

+0

Вы правы, так называются процедуры. Я просто хочу спросить Oracle: «Что может сделать эта учетная запись?» Есть ли способ сделать это, или я просто знаю, что у меня есть разрешение делать все, что содержится в этом пакете? [И снова это связано с тем, что наша поддержка от владеющей компании крайне ограничена. Я хочу помочь нам помочь себе.] –

+0

dpbradley: Спасибо за помощь. У меня все работает, как описано выше, но вы подтвердили, что мне интересно о пакетах и ​​разрешениях. –

Смежные вопросы