Oracle PL/SQLはfunctionでDBMSを呼び出すことはできません.LOCK(Grant to role OR Grant to user)

2097 ワード

既知:ユーザーtuser 1をテストし、ロールtrole 1をテストし、trole 1はtuser 1に許可されています.
プログラムをテストするときに遅延が必要なのでdbms_lockはtrole 1に権限を与え、匿名のブロックに入れてテストしても問題ありません.
SQL> set serveroutput on;
SQL> 
SQL> BEGIN
  2    dbms_output.put_line(systimestamp);
  3    --  dbms_backup_restore.sleep(3);
  4    dbms_lock.sleep(3);
  5    dbms_output.put_line(systimestamp);
  6  END;
  7  /
 
24-JUN-11 04.30.57.722000000 PM +08:00
24-JUN-11 04.31.00.723000000 PM +08:00
 
PL/SQL procedure successfully completed
 
SQL> 

 
しかしfunctionに移動するとエラーが発生しました
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as tuser1
 
SQL> 
SQL> CREATE OR REPLACE FUNCTION sum2(p_deptno IN NUMBER) RETURN NUMBER IS
  2    l_ret NUMBER;
  3  BEGIN
  4    dbms_lock.sleep(5);
  5    SELECT SUM(sal)
  6    INTO   l_ret
  7    FROM   emp
  8    WHERE  deptno = p_deptno;
  9    RETURN l_ret;
 10  END sum2;
 11  /
 
Warning: Function created with compilation errors
 
SQL> show err;
Errors for FUNCTION TUSER1.SUM2:
 
LINE/COL ERROR
-------- --------------------------------------------------
4/3      PLS-00201: identifier 'DBMS_LOCK' must be declared
4/3      PL/SQL: Statement ignored

 
不思議なことにfunctionでdbms_を使えないのかlock、googleちょっと、答えを見つけます:
dbms_をlockのexecute権限はユーザーに直接grantしなければならず、grantがロールに与えるだけでエラーが発生します.
REF:http://forums.oracle.com/forums/thread.jspa?threadID=902392&tstart=0&messageID=3481832
 
今functionは正常に作成できますが、なぜですか?grant to userとgrant to roleはどのようにいくつかのobjectで違いがありますか?
SQL> 
SQL> CREATE OR REPLACE FUNCTION sum2(p_deptno IN NUMBER)
  2    RETURN NUMBER IS PRAGMA AUTONOMOUS_TRANSACTION;
  3  l_ret NUMBER;
  4  BEGIN
  5    dbms_lock.sleep(5);
  6    --DBMS_BACKUP_RESTORE.SLEEP(5);
  7    dbms_output.put_line(systimestamp);
  8    SELECT SUM(sal)
  9    INTO   l_ret
 10    FROM   emp
 11    WHERE  deptno = p_deptno;
 12    RETURN l_ret;
 13  END sum2;
 14  /
 
Function created
 
SQL> 

テキストリンク:http://blog.csdn.net/t0nsha/article/details/6566135