Как выполнить выполнение на dbms_lock в Oracle?

Мне нужно использовать процедуру dbms_lock.sleep от пользователя usr1. Я не могу войти в систему как sys, но у меня есть пароль для пользователя usr2, который имеет привилегию "предоставить любую привилегию объекта". Однако, когда я зарегистрировался как usr2 и попытаюсь выпустить

grant execute on sys.dbms_lock to usr1

Я получаю исключение "недостаточных привилегий" ORA-01031. То же самое работает с тестовым пакетом для другого пользователя. Являются ли системные пакеты обработаны специально или я что-то пропустил?

Ответ 1

Системные пакеты обрабатываются специально, в зависимости от значения параметра инициализации O7_DICTIONARY_ACCESSIBILITY. Если это FALSE, который по умолчанию используется с Oracle 9i, тогда привилегии ANY не применяются к словарю данных. Документация относится к этому как "защита словаря".

Ближайший я могу найти в руководстве по безопасности - здесь и здесь - в качестве примеров ссылайтесь только на таблицы.

В примечании поддержки Oracle 174753.1 указано, что защита словаря заменяет grant any object privilege. Мне не разрешено процитировать это, но он объясняет, что вы видите; возможно, стоит посмотреть, если у вас есть к нему доступ.

Итак, единственный способ usr2 usr2 иметь возможность grant execute on sys.dbms_lock to usr1 - выполнить DBA grant execute on sys.dbms_lock to usr2 with grant option.

Как говорит Бен, вам нужно либо заставить администратор базы данных предоставить разрешение на usr1 напрямую, либо добавить with grant option к привилегиям, предоставленным usr2; или usr2 создать процедуру обертки вокруг вызова dbms_lock и предоставить разрешения для этого на usr1.

Ответ 2

Звучит так, как будто SYS не была предоставлена ​​роль DBA или что SYS не имеет привилегии GRANT ANY OBJECT. Процитировать документацию

Чтобы предоставить объектную привилегию, вы должны владеть объектом или владельцем объект должен предоставить вам права объекта с помощью GRANT ВАРИАНТ, или вам, должно быть, был предоставлен ГРАНТ ЛЮБАЯ ПРИВИЛЕГИЯ ОБЪЕКТА системные привилегии. Если у вас есть ПРЕДОСТАВЛЕНИЕ ЛЮБОГО ОБЪЕКТА PRIVILEGE, то вы может предоставить привилегию объекта только в том случае, если владелец объекта мог предоставили такую ​​же привилегию объекта.

Это означает, что вы не можете выполнить execute на dbms_lock, потому что SYS не смог бы этого сделать.

При установке SYS автоматически получает роль DBA, поэтому, возможно, кто-то изменил это или создал другого пользователя с ролью DBA.

В любом случае вам придется привлечь вашего администратора базы данных, если у вас есть только доступ к этим двум пользователям. Попросите их предоставить выполнение пакетов, которые вам нужны, пользователям, которые в этом нуждаются. Это зависит от вас, чтобы дать вам вескую причину, по которой они не будут предоставлять вам выполнение на необходимых вам пакетах, чтобы выполнить вашу работу.

Если вы не можете получить полный доступ к dbms_lock, вы всегда можете создать процедуру у другого пользователя, который обертывает dbms_lock.sleep, вам нужно, а затем предоставить выполнение только этой процедуры.