Oracle数据库用户即使具有相关权限也无法创建DB作业

Oracle数据库用户即使具有相关权限也无法创建DB作业,oracle,stored-procedures,oracle10g,dbms-scheduler,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 但是,当我尝试调用一个存储过程(该存储过程反过来调用DBMS_SCHEDULER.create_job方法)时,我得到了一个特权不足错误 存储过程: 我使用SQL developer执行了下面

我有一个名为ADMUSER的Oracle数据库用户,具有以下权限,据我所知,这些权限是创建数据库作业所需的权限。[Oracle数据库版本为Oracle 10g 10.2.0.4]

CREATE JOB
CREATE ANY JOB
CREATE EXTERNAL JOB
MANAGE SCHEDULER
但是,当我尝试调用一个存储过程(该存储过程反过来调用DBMS_SCHEDULER.create_job方法)时,我得到了一个特权不足错误

存储过程:

我使用SQL developer执行了下面提到的SP,我尝试这样运行,因为当我使用java jdbc调用like{call PROD_Procedures.PROD_dispatch_main_job?,?,?}时,它不起作用

begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;
然后我得到了以下错误

第422行包含DBMS_调度程序。创建_作业。。。一串 但正如我前面提到的,当我检查session_privs表时,我可以看到这个用户具有上述权限。 谁能帮我解决这个问题

更新: 我将create_job函数中job_class的值替换为“DEFAULT_job_class”。然后它就可以毫无问题地工作了。因此,我认为该用户需要一些特权才能访问“CONSOLIDATE_CLASS”作业类。 任何人都可以让我知道如何检查数据库中授予此用户此作业类的权限吗?我应该参考哪个表来检查对象的权限授予

在授予特权之前,我需要验证此用户没有“CONSOLIDATE_CLASS”的执行特权

调用DBMS\u调度程序时。创建\u作业。。。您可以为job_类参数指定值

用户必须对CONSOLIDATE_类作业类具有执行权限,才能创建属于此类的作业:

更新

若要检查用户是否允许使用此类创建作业,可以查看“所有”选项卡“权限”视图:


DBA的第一次登录应该是通过如下查询授予此授权:

BEGIN
  grant create any job to **ADMUSER**;
  grant execute on DBMS_SCHEDULER to **ADMUSER**;
  grant manage scheduler to **ADMUSER**;
END;

用户是否通过角色拥有这些权限?还是直接授予?会话权限包括通过当前会话中启用的任何角色授予的权限。定义者权限存储过程只能访问直接授予的权限。我可以在dba_sys_privs表中检查权限吗?当我检查该表时,我可以看到创建作业、创建任何作业、管理授予该用户的调度程序,但创建外部作业是通过另一个角色授予的。这可能是问题所在吗?拥有prod_procedures软件包的用户是否与您登录的用户相同?@ThinkJet是,该软件包的所有者和我使用的用户是同一用户。@ThinkJet请检查我对该问题所做的更新。谢谢
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).
grant execute on user_who_owns_class.CONSOLIDATE_CLASS to user_who_creates_job
select count(1) 
from all_tab_privs 
where 
  table_name = 'PROD_DISPATCH_JOB' 
  and 
  table_schema = upper('<job class owner name here>')
  and
  privilege = 'EXECUTE'
  and 
  grantee in (
    select 'PUBLIC' from dual  -- granted to public
    union 
    select upper('<current_user_name_here>') from dual -- direct grant
    union
    select role from session_roles  -- roles enabled for current session
  )
BEGIN
  grant create any job to **ADMUSER**;
  grant execute on DBMS_SCHEDULER to **ADMUSER**;
  grant manage scheduler to **ADMUSER**;
END;