Sleep function in ORACLE

后端 未结 11 1903
一整个雨季
一整个雨季 2020-11-30 00:52

I need execute an SQL query in ORACLE it takes a certain amount of time. So I wrote this function:

CREATE OR REPLACE FUNCTION MYSCHEMA.TEST_SLEEP
(
TIME_  I         


        
11条回答
  •  南方客
    南方客 (楼主)
    2020-11-30 01:20

    Create a procedure which just does your lock and install it into a different user, who is "trusted" with dbms_lock ( USERA ), grant USERA access to dbms_lock.

    Then just grant USERB access to this function. They then wont need to be able to access DBMS_LOCK

    ( make sure you don't have usera and userb in your system before running this )

    Connect as a user with grant privs for dbms_lock, and can create users

    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 */
    

提交回复
热议问题