Welcome 微信登录

首页 / 数据库 / MySQL / Oracle PL/SQL之不能在function里面调用DBMS_LOCK(Grant to role OR Grant to user)

已知:测试用户tuser1,测试角色trole1,trole1已经授权给了tuser1。在测试一段程序时需要用到延时,于是就把dbms_lock授权给了trole1,放在匿名块里测试没有问题:
  1. SQL> set serveroutput on;  
  2. SQL>   
  3. SQL> BEGIN  
  4.   2    dbms_output.put_line(systimestamp);  
  5.   3    --  dbms_backup_restore.sleep(3);  
  6.   4    dbms_lock.sleep(3);  
  7.   5    dbms_output.put_line(systimestamp);  
  8.   6  END;  
  9.   7  /  
  10.    
  11. 24-JUN-11 04.30.57.722000000 PM +08:00  
  12. 24-JUN-11 04.31.00.723000000 PM +08:00  
  13.    
  14. PL/SQL procedure successfully completed  
  15.    
  16. SQL>   
但是把它移到function里面却报错了:
  1. Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0   
  2. Connected as tuser1  
  3.    
  4. SQL>   
  5. SQL> CREATE OR REPLACE FUNCTION sum2(p_deptno IN NUMBER) RETURN NUMBER IS  
  6.   2    l_ret NUMBER;  
  7.   3  BEGIN  
  8.   4    dbms_lock.sleep(5);  
  9.   5    SELECT SUM(sal)  
  10.   6    INTO   l_ret  
  11.   7    FROM   emp  
  12.   8    WHERE  deptno = p_deptno;  
  13.   9    RETURN l_ret;  
  14.  10  END sum2;  
  15.  11  /  
  16.    
  17. Warning: Function created with compilation errors  
  18.    
  19. SQL> show err;  
  20. Errors for FUNCTION TUSER1.SUM2:  
  21.    
  22. LINE/COL ERROR  
  23. -------- --------------------------------------------------  
  24. 4/3      PLS-00201: identifier "DBMS_LOCK" must be declared  
  25. 4/3      PL/SQL: Statement ignored  
很奇怪,难道不能在function里面用dbms_lock,google一下,找到答案:必须把dbms_lock的execute权限直接grant给用户才行,只grant给角色就会报错。现在function可以正常创建了,不过为什么呢?怎么会存在grant to user和grant to role在某些object上有区别?
  1. SQL>   
  2. SQL> CREATE OR REPLACE FUNCTION sum2(p_deptno IN NUMBER)  
  3.   2    RETURN NUMBER IS PRAGMA AUTONOMOUS_TRANSACTION;  
  4.   3  l_ret NUMBER;  
  5.   4  BEGIN  
  6.   5    dbms_lock.sleep(5);  
  7.   6    --DBMS_BACKUP_RESTORE.SLEEP(5);  
  8.   7    dbms_output.put_line(systimestamp);  
  9.   8    SELECT SUM(sal)  
  10.   9    INTO   l_ret  
  11.  10    FROM   emp  
  12.  11    WHERE  deptno = p_deptno;  
  13.  12    RETURN l_ret;  
  14.  13  END sum2;  
  15.  14  /  
  16.    
  17. Function created  
  18.    
  19. SQL>   
Oracle PL/SQL之ENABLE NOVALIDATE约束Oracle 完整的闪回操作相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数
版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图