JOB调用的权限问题

今天在处理一个JOB错误的时候,才发现自己对JOB的运气权限理解有误。


一直认为JOB中WHAT存放的是匿名块,因此JOB中使用的权限应该和匿名块一致。没有想到JOB相当于定义者权限存储过程中的权限,只对直接授权有效,而对角色无效。

看一个简单的例子:

SQL> CREATE TABLE T (ID NUMBER);

表已创建。

SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE YANGTK;

用户已创建

SQL> GRANT CONNECT, RESOURCE TO TEST;

授权成功。

SQL> CREATE ROLE R_INSERT_T;

角色已创建

SQL> GRANT INSERT ON T TO R_INSERT_T;

授权成功。

SQL> GRANT R_INSERT_T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST
已连接。
SQL> INSERT INTO YANGTK.T VALUES (1);

已创建 1 行。

SQL> BEGIN
2 INSERT INTO YANGTK.T VALUES (2);
3 END;
4 /

PL/SQL 过程已成功完成。

SQL> CREATE OR REPLACE PROCEDURE P_TEST_DEFINE AS
2 BEGIN
3 EXECUTE IMMEDIATE 'INSERT INTO YANGTK.T VALUES (3)';
4 END;
5 /

过程已创建。

SQL> EXEC P_TEST_DEFINE
BEGIN P_TEST_DEFINE; END;

*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
ORA-06512: 在"TEST.P_TEST_DEFINE", line 3
ORA-06512: 在line 1

通过角色获得的授权,可以在SQL中和匿名块中使用,但是对定义者存储过程无效。

下面看看JOB的情况:

SQL> DECLARE
2 V_JOB NUMBER;
3 BEGIN
4 DBMS_JOB.SUBMIT(V_JOB, 'BEGIN INSERT INTO YANGTK.T VALUES (5); END;', SYSDATE);
5 COMMIT;
6 END;
7 /

PL/SQL 过程已成功完成。

SQL> COL WHAT FORMAT A60
SQL> SELECT JOB, WHAT, FAILURES FROM USER_JOBS;

JOB WHAT FAILURES
---------- ---------------------------------------------------- ----------
104 BEGIN INSERT INTO YANGTK.T VALUES (5); END; 1

SQL> EXEC DBMS_JOB.RUN(104)
BEGIN DBMS_JOB.RUN(104); END;

*
ERROR 位于第 1 行:
ORA-12011: 无法执行 1 作业
ORA-06512: 在"SYS.DBMS_IJOB", line 406
ORA-06512: 在"SYS.DBMS_JOB", line 272
ORA-06512: 在line 1

显然JOB无法正常运行,检查后台ALERT文件:

Sun Mar 18 20:35:49 2007
Errors in file f:oracleadmintestudumptest_ora_1032.trc:
ORA-12012: 自动执行作业 104 出错
ORA-06550: 第 1 行, 第 121 列:
PL/SQL: ORA-00942: 表或视图不存在
ORA-06550: 第 1 行, 第 102 列:
PL/SQL: SQL Statement ignored

由此可见,JOB的权限和存储过程一致,通过角色的授权是无效的。

SQL> CONN YANGTK/YANGTK@TEST
已连接。
SQL> GRANT INSERT ON T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST
已连接。
SQL> EXEC DBMS_JOB.RUN(104)

PL/SQL 过程已成功完成。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69212/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-69212/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值