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

本文探讨了在Oracle数据库中将dbms_lock授予角色与直接授予用户之间的区别,解释了为何在函数中使用dbms_lock时需将权限直接授予用户而非角色,并提供了通过PRAGMA AUTONOMOUS_TRANSACTION解决相关问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已知:测试用户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>

转载于:https://www.cnblogs.com/zlja/archive/2011/06/24/2449097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值