Oracle PL / SQL: получить список разрешенных процедур для учетной записи - PullRequest
3 голосов
/ 12 февраля 2010

Я исследовал здесь и в других местах, но не нашел ответа на следующие вопросы.

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

 SELECT * from user_procedures;

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 12 февраля 2010

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

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

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

1 голос
/ 12 февраля 2010

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

1 голос
/ 12 февраля 2010

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

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

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

...