Oracle PL/SQL之不能在function里面调用DBMS_LOCK(Grant to role OR Grant to user)

本文详细解析了在Oracle数据库环境中,如何正确授权dbms_lock执行权限,以及在函数与匿名块中使用该功能的区别。通过实例演示了在不同场景下授权方式的差异,并解释了其背后的原因。

已知:测试用户tuser1,测试角色trole1,trole1已经授权给了tuser1。

在测试一段程序时需要用到延时,于是就把dbms_lock授权给了trole1,放在匿名块里测试没有问题:

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.youkuaiyun.com/t0nsha/article/details/6566135

转载于:https://my.oschina.net/dtec/blog/46774

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值