在PL-SQL-Procedure中不可能使用DBMS_SCHEDULER.STOP_JOB,授予

时间:2015-08-28 12:51:26

标签: oracle dbms-scheduler

我的问题是在包中使用DBMS_SCHEDULER。我已经为用户提供了SCHEDULER_ADMIN权限。现在,我可以在程序之外通过脚本创建作业后,在我的程序中设置这些命令。

 -- set Job-Parameters
  DBMS_SCHEDULER.SET_ATTRIBUTE(
   name                     => jobidentifier,
   attribute                => 'job_action',
   value                    => jobparam);
   --  Job run.
   DBMS_SCHEDULER.ENABLE(jobidentifier);   

到目前为止一切进展顺利。

现在我的问题:为什么这些命令在我的程序代码中不起作用?

 -- Stop Job
DBMS_SCHEDULER.STOP_JOB (
   job_name                 =>  jobidentifier,
   force                    =>  true);

  -- disable Job
DBMS_SCHEDULER.DISABLE(jobidentifier);

只要我通过脚本在自己的会话中输入命令而不是嵌入在包代码中,命令就可以工作。问题是我想在我的PL-SQL包中输入这些命令,因为在我的包中我知道何时发生错误,所以我想输入这些命令。

你能帮帮我吗?非常感谢你。

我收到以下错误:

ORA-27486:Nicht ausreichende Berechtigungen ORA-06512:in" SYS.DBMS_ISCHED",Zeile 210 ORA-06512:in" SYS.DBMS_SCHEDULER",Zeile 557 ORA-06512: in" SCHEMANAME.JOB_KILLEN_PCK",Zeile 31 ORA-06512:在Zeile 6中

我所做的格兰特是由sys_user提供的:

GRANT SCHEDULER_ADMIN TO SCHEMANAME 
第31行中的

有以下代码

DBMS_SCHEDULER.STOP_JOB ( job_name => jobname, force => true); 

这是出于安全原因,Oracle不希望我通过启动过程来阻止stop_jobs。因为这样我可以停止每个工作,我知道这个名字?如果这是正确的,我将无法在我的程序中的作业期间发生故障时停止作业

如果您愿意,我可以将测试包发送给您

2 个答案:

答案 0 :(得分:0)

我认为使用force选项的stop_job需要授予拥有该作业的用户的MANAGE SCHEDULER系统特权。

希望这有帮助。

@balakshman

答案 1 :(得分:0)

请不要使用Force选项,您会很好,请在下面的示例中找到它与程序包集成很好的工作。

DECLARE
V_COUNT NUMBER(3);
BEGIN
    DBMS_SCHEDULER.STOP_JOB(job_name=>'ORDER_REPORT_JOB_1');
    SELECT COUNT(*) INTO V_COUNT FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'ORDER_REPORT_JOB_1';
    --THIS ORDER_REPORT_JOB_1 EXIST THEN ONLY DROP THE JOB
    IF (V_COUNT=1) THEN
        DBMS_SCHEDULER.DROP_JOB ('ORDER_REPORT_JOB_1');
    END IF; 
END;
/