【问题标题】:An Oracle database user cannot create a DB job even with relevant privilegesOracle 数据库用户即使拥有相关权限也无法创建数据库作业
【发布时间】:2013-06-28 02:50:18
【问题描述】:

我有一个名为“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”的执行权限。

【问题讨论】:

  • 用户是否通过角色拥有这些权限?还是直接授予? session_privs 包括通过在当前会话中启用的任何角色授予的权限。定义者权限存储过程只能访问直接授予的权限。
  • 我可以检查 dba_sys_privs 表中的权限吗?当我检查该表时,我可以看到授予该用户的“CREATE JOB,CREATE ANY JOB,MANAGE SCHEDULER”,但“CREATE EXTERNAL JOB”是通过另一个角色授予的。这可能是问题吗?
  • 拥有prod_procedures 包的用户与您登录的用户相同吗?
  • @ThinkJet 是的,该包的所有者和我使用的用户是同一用户。
  • @ThinkJet 请检查我对该问题所做的更新。谢谢。

标签: oracle stored-procedures oracle10g dbms-scheduler


【解决方案1】:

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

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

  

【讨论】:

    【解决方案2】:

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

    用户必须拥有CONSOLIDATE_CLASS 作业类的EXECUTE 权限才能创建属于该类的作业 (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
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2023-04-02
      • 2016-11-18
      • 2012-01-04
      相关资源
      最近更新 更多