【问题标题】:Oracle privilege missing for DBMS_SCHEDULER, ORA-27486 after GRANT CREATE JOB, CREATE EXTERNAL JOBGRANT CREATE JOB, CREATE EXTERNAL JOB 后 DBMS_SCHEDULER 缺少 Oracle 权限,ORA-27486
【发布时间】:2011-07-12 07:19:12
【问题描述】:

我还缺少什么额外的特权?

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>
SQL> create user myUser identified by password default tablespace theData temporary tablespace temp;

User created.

SQL> grant connect, resource to myUser;

Grant succeeded.

SQL> GRANT READ,WRITE ON DIRECTORY tmp TO myUser;

Grant succeeded.

SQL> GRANT CREATE JOB TO myUser;

Grant succeeded.

SQL> GRANT CREATE EXTERNAL JOB TO myUser;

Grant succeeded.

SQL> connect myUser/password
Connected.
SQL>
SQL>
1 CREATE PROCEDURE shellScript
2 AS
3 /*-----------------------*/
4 v_sql UTL_FILE.FILE_TYPE;
5 v_shell UTL_FILE.FILE_TYPE;
6 /*=======================*/
7 BEGIN
8 /*=======================*/
9 -- write the sql script to /tmp/myUser-tmp-script.sql
10 v_sql:= UTL_FILE.FOPEN('TMP','myUser-tmp-script.sql','w');
11 UTL_FILE.PUT_LINE(v_sql,'select to_char(sysdate,''YYYYMMDDHR24MISS'') from dual'||';', FALSE);
12 UTL_FILE.FFLUSH(v_sql);
13 UTL_FILE.FCLOSE(v_sql);
14 -- write the shell script to /tmp/myUser-tmp-script.sh
15 v_shell:= UTL_FILE.FOPEN('TMP','myUser-tmp-script.sh','w');
16 UTL_FILE.PUT_LINE(v_shell,'#!/bin/bash', FALSE);
17 UTL_FILE.PUT_LINE(v_shell,'sqlplus myUser/password@sbox @/tmp/myUser-tmp-script.sql > /tmp/myUser-tmp-script.err', FALSE);
18 UTL_FILE.FFLUSH(v_shell);
19 UTL_FILE.FCLOSE(v_shell);
20 -- execute the shell script which executes the sql script
21 DBMS_SCHEDULER.PURGE_LOG(JOB_NAME=>'myJob');
22 DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'myJob', JOB_TYPE=>'EXECUTABLE', JOB_ACTION=>'/bin/bash', NUMBER_OF_ARGUMENTS=>1, START_DATE=>SYSTIMESTAMP, ENABLED=>FALSE);
23 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('myJob', 1, '/tmp/myUser-tmp-script.sh');
24 DBMS_SCHEDULER.ENABLE('myJob');
25 USER_LOCK.SLEEP(500); -- give it 5 seconds to complete
26 -- clean up
27 UTL_FILE.FREMOVE('TMP', 'myUser-tmp-script.sh');
28 UTL_FILE.FREMOVE('TMP', 'myUser-tmp-script.sql');
29 /*=======================*/
30 END shellScript;
/

Procedure created.

SQL> SHOW ERRORS PROCEDURE shellScript
No errors.
SQL>
SQL>
SQL> execute shellScript;
BEGIN shellScript; END;

*
ERROR at line 1:
ORA-27486: insufficient privileges
ORA-06512: at "SYS.DBMS_ISCHED", line 411
ORA-06512: at "SYS.DBMS_ISCHED", line 452
ORA-06512: at "SYS.DBMS_SCHEDULER", line 1082
ORA-06512: at "MYUSER.SHELLSCRIPT", line 21
ORA-06512: at line 1

SQL>

【问题讨论】:

    标签: oracle privileges


    【解决方案1】:

    根据TFM,PURGE_LOG 需要 MANAGE SCHEDULER 权限:

    GRANT MANAGE SCHEDULER TO xxx;
    

    【讨论】:

      【解决方案2】:

      哇,我发现了问题...“myJob”是数据库中现有的包对象。我猜我的“权限不足”是用作业对象替换包对象。

      【讨论】:

      • 命名空间并不总是像我们期望的那样......我写了一本关于这个的书(Mastering Oracle Scheduler)并且一直忘记...... ;-)
      【解决方案3】:

      如果您获得了管理调度程序权限,接下来会失败的地方是 shell 脚本中不存在的执行位。如果执行位到位,它将失败,因为它缺少运行 SQL*Plus 所需的环境设置,如 PATH 和 ORACLE_HOME。

      除此之外,为什么还要坚持 10 克? Oracle 11g 有更好的选项来运行外部作业,安全性由凭据实现,而不是 $ORACLE_HOME 中定义用户运行作业的文件。

      关于这个主题有一些非常好的阅读资料,请参阅我的个人资料。

      我希望这会有所帮助, 罗纳德。

      【讨论】:

      • 我通过将我的脚本作为参数传递给 /bin/bash 来避免 shell 脚本中缺少“执行位”。
      • 是的,你是对的,我错过了,对不起。您仍然需要注意环境设置,因为您的作业是在一个非常空的环境中启动的。
      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多