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

时间:2013-07-01 02:35:54

标签: 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方法时,我得到的权限不足错误。

存储过程:

   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;

我使用SQL开发人员执行了下面提到的SP(我试图像这样运行,因为当我使用java jdbc调用“{call PROD_Procedures.prod_dispatch_main_job(?,?,?)}”时它不起作用)。

begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;

然后我收到以下错误

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).

第422行包含“DBMS_SCHEDULER.create_job”...字符串。 但正如我之前提到的,当我检查“session_privs”表时,我可以看到该用户具有上述权限。 有人可以帮我解决这个问题吗?


更新 我用'DEFAULT_JOB_CLASS'替换了create_job函数中job_class的值。然后它没有任何问题。因此,我认为此用户需要一些权限才能访问“CONSOLIDATE_CLASS”作业类。 任何人都可以让我知道如何检查数据库中是否为此用户授予此作业类的权限?我应该参考什么表检查对象的权限授予?

我需要在授予权限之前验证此用户在'CONSOLIDATE_CLASS'上没有执行权限。

2 个答案:

答案 0 :(得分:5)

首次登录DBA应该通过查询来提供此授权:

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

答案 1 :(得分:2)

调用DBMS_SCHEDULER.create_job(...)时,请指定job_class参数的值。

用户必须拥有EXECUTE作业类CONSOLIDATE_CLASS权限才能创建属于此类的作业(documentation link):

grant execute on user_who_owns_class.CONSOLIDATE_CLASS to user_who_creates_job

<强>更新

要检查用户是否允许使用此课程创建作业,您可以查看all_tab_privs视图:

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
  )
相关问题