做JAVA开发,想向DBA发展,一直学管理方面的东西,对存储过程一直以为都是编码,只是语法不同,今天做存储过程定制JOB的时候发现不是那么回事,看来还要好多要学呀!!!!!!!!
说明: procedure 本身可以执行.但是放到job中执行错误
ORA-12012: 自动执行作业 187 出错
ORA-01031: 权限不足
ORA-06512: 在"EMMA.PACK_SMS", line 16
ORA-06512: 在"EMMA.PACK_SMS", line 36
奇怪的就是proc本身能够执行,但是放到job中为什么不能执行了呢,查看proc ,发现里面存在 execute immediate create table ,
说明:在存储过程中使用的到系统权限不能通过rule来授权,需要显示授权,或者使用AUTHID CURRENT_USER
发现次存储过程使用了AUTHID CURRENT_USER ,所以存储过程能够执行.可是在job中就不能执行了.可知job是oracle后台进程启动的.这点就想不通了.
sql>grant create table to user_name;
之后就可以run job了.
这里可以利用10046 , 1031 trace name errorstack 来进行trace
sql>alter session set events '10046 trace name context forever , level 12';
sql>alter session set events '1031 trace name errorstack level 1';
DECLARE
BEGIN
dbms_job.run(187);
END;
/
查看trace ,发现
ksedmp: internal or fatal error
ORA-01031: 权限不足
Current SQL statement for this session:
create table s_tab as select * from stable
由此可知在job中必须显示授权.