ロックを行うだけのプロシージャを作成し、それを dbms_lock ( USERA ) で「信頼」されている別のユーザーにインストールし、USERA に dbms_lock へのアクセスを許可します。
次に、この関数への USERB アクセスを許可します。その後、DBMS_LOCK にアクセスできる必要はありません。
(これを実行する前に、システムに usera と userb がないことを確認してください)
dbms_lock の付与特権を持つユーザーとして接続し、ユーザーを作成できます
drop user usera cascade;
drop user userb cascade;
create user usera default tablespace users identified by abc123;
grant create session to usera;
grant resource to usera;
grant execute on dbms_lock to usera;
create user userb default tablespace users identified by abc123;
grant create session to userb;
grant resource to useb
connect usera/abc123;
create or replace function usera.f_sleep( in_time number ) return number is
begin
dbms_lock.sleep(in_time);
return 1;
end;
/
grant execute on usera.f_sleep to userb;
connect userb/abc123;
/* About to sleep as userb */
select usera.f_sleep(5) from dual;
/* Finished sleeping as userb */
/* Attempt to access dbms_lock as userb.. Should fail */
begin
dbms_lock.sleep(5);
end;
/
/* Finished */