0

我的问题是关于在包中使用 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: 在 "SYS.DBMS_ISCHED", Zeile 210 ORA-06512: 在 "SYS.DBMS_SCHEDULER", Zeile 557 ORA-06512: 在 "SCHEMANAME.JOB_KILLEN_PCK", Zeile 31 ORA-06512:在泽勒 6

我所做的授权是由 sys_user 提供的:

GRANT SCHEDULER_ADMIN TO SCHEMANAME 

在第 31 行有以下代码

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

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

如果你愿意,我可以给你发我的测试包

4

2 回答 2

1

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

希望这可以帮助。

@balakshman

于 2016-05-17T19:47:44.103 回答
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;
/
于 2019-06-06T10:08:17.927 回答