Man*_*ula 1 oracle stored-procedures oracle10g dbms-scheduler
我有一个名为"ADMUSER"的Oracle数据库用户具有以下权限,这是根据我的理解创建数据库作业所需的权限.[Oracle数据库版本是Oracle 10g 10.2.0.4]
CREATE JOB
CREATE ANY JOB
CREATE EXTERNAL JOB
MANAGE SCHEDULER
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用一个存储过程而后调用DBMS_SCHEDULER.create_job方法时,我得到的权限不足错误.
存储过程:
PROCEDURE prod_dispatch_main_job (l_max_job IN NUMBER,
l_interval IN NUMBER,
l_freq IN VARCHAR2)
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'PROD_DISPATCH_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN PROD_Procedures.prod_run_user_job('
|| l_max_job
|| '); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq='
|| l_freq
|| ';interval='
|| l_interval,
job_class => 'CONSOLIDATE_CLASS',
enabled => TRUE,
auto_drop => FALSE);
END;
Run Code Online (Sandbox Code Playgroud)
我使用SQL开发人员执行了下面提到的SP(我尝试像这样运行,因为当我使用java jdbc调用"{call PROD_Procedures.prod_dispatch_main_job(?,?,?)}"时它不起作用.
begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误.
Error starting at line 7 in command:
begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;
Error report:
ORA-27486: insufficient privileges
ORA-06512: at "SYS.DBMS_ISCHED", line 99
ORA-06512: at "SYS.DBMS_SCHEDULER", line 262
ORA-06512: at "ADMUSER.PROD_PROCEDURES", line 422
ORA-06512: at line 2
27486. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a scheduler operation without the
required privileges.
*Action: Ask a sufficiently privileged user to perform the requested
operation, or grant the required privileges to the proper user(s).
Run Code Online (Sandbox Code Playgroud)
第422行包含"DBMS_SCHEDULER.create_job"...字符串.但正如我之前提到的,当我检查"session_privs"表时,我可以看到该用户具有上述权限.有人可以帮我解决这个问题吗?
更新: 我用'DEFAULT_JOB_CLASS'替换了create_job函数中job_class的值.然后它没有任何问题.因此,我认为此用户需要一些权限才能访问"CONSOLIDATE_CLASS"作业类.任何人都可以让我知道如何检查数据库以获取此用户在此作业类上授予的权限吗?我应该参考什么表检查对象的权限授予?
在授予权限之前,我需要验证此用户在"CONSOLIDATE_CLASS"上没有执行权限.
从DBA首次登录应该是通过查询来提供此授权,如下所示:
BEGIN
grant create any job to **ADMUSER**;
grant execute on DBMS_SCHEDULER to **ADMUSER**;
grant manage scheduler to **ADMUSER**;
END;
Run Code Online (Sandbox Code Playgroud)