暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle 尽管授予了权限,但在PL-SQL-Procedure中仍不可能有DBMS_SCHEDULER.SDOP_JOB

askTom 2015-09-15
448

问题描述

我的问题是关于在包中使用DBMS_SCHEDULER的问题。我已将调度器_管理员权限授予用户。现在,我可以在通过脚本在过程外部创建作业之后,在过程内部设置这些命令。

--设置作业参数
DBMS_SCHULER.SET_ATtriBTE(
名称=>作业标识符,
属性=>'job_action',
值=> jobparam) ;
--作业运行。
DBMS_SCHULER.ENE (作业标识符) ;


到目前为止一切都很顺利。

现在我的问题是:为什么这些命令在我的过程代码中不起作用?
--停止作业
DBMS_SCHEDULER.STOP_JOB(
作业名称=>作业标识符,
强制=> true) ;

--禁用作业
DBMS_SCHEDULER.DISABLE(jobidentifier);


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

你能帮我吗?谢谢你,谢谢你。

出现以下错误:

ORA-27486 :尼赫特ausreichende Berchttigungen ORA-06512 :在“SYS.DBMS_ISCHED”中, Zeile 210 ORA-06512 :在“SYS.DBMS_SCHEDULER”中, Zeile 557 ORA-06512 :在"SCHMANAME.JOB_KILEN_PCK"中, Zeile 31 ORA-06512 :在Zeile 6

我的授权由sys_user授予:
授权调度器管理到架构名称


在第31行中有以下代码
DBMS_SCHEDULER.STOP_JOB( job_name => jobname, force => true);


这是否出于安全原因, Oracle不希望我能够通过启动过程来stop_作业。因为这样我就能阻止我知道名字的每一份工作?如果这是正确的,我将无法停止作业,因为在我的操作过程中出现故障

如果你愿意,我可以把我的测试包寄给你。我回到9月28日。

专家解答

在过程执行过程期间不会启用角色,因此在过程中, Scheduler_阮不会为您提供帮助。如果我们看一下调度器_


SQL> select * from dba_sys_privs
  2  where grantee = 'SCHEDULER_ADMIN';

GRANTEE         PRIVILEGE                                ADM COM
--------------- ---------------------------------------- --- ---
SCHEDULER_ADMIN CREATE JOB                               YES YES
SCHEDULER_ADMIN EXECUTE ANY CLASS                        YES YES
SCHEDULER_ADMIN CREATE CREDENTIAL                        YES YES
SCHEDULER_ADMIN CREATE ANY CREDENTIAL                    YES YES
SCHEDULER_ADMIN EXECUTE ANY PROGRAM                      YES YES
SCHEDULER_ADMIN CREATE ANY JOB                           YES YES
SCHEDULER_ADMIN MANAGE SCHEDULER                         YES YES
SCHEDULER_ADMIN CREATE EXTERNAL JOB                      YES YES



并查看有关

STOP_JOB with the force option requires that you have the MANAGE SCHEDULER privilege.

然后我们就可以做出必要的调整...

SQL> create user DEMO identified by DEMO;

User created.

SQL>
SQL> grant connect, create job , manage scheduler, create procedure to demo;

Grant succeeded.

SQL> grant execute on dbms_lock to demo;

Grant succeeded.

SQL>
SQL> connect DEMO/DEMO
Connected.

SQL>
SQL> BEGIN
  2    DBMS_SCHEDULER.create_job (
  3      job_name        => 'MY_JOB',
  4      job_type        => 'PLSQL_BLOCK',
  5      job_action      => 'BEGIN for i in 1 .. 60 loop dbms_lock.sleep(1); end loop; END;',
  6      start_date      => sysdate,
  7      enabled         => TRUE);
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> create or replace
  2  package DEMO.PKG is
  3    procedure stopper;
  4  end;
  5  /

Package created.

SQL>
SQL> create or replace
  2  package body DEMO.PKG is
  3    procedure stopper is
  4    begin
  5      dbms_scheduler.stop_job('DEMO.MY_JOB',force=>true);
  6    end;
  7  end;
  8  /

Package body created.

SQL>
SQL> exec pkg.stopper;

PL/SQL procedure successfully completed.


希望这个能帮上忙。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论