Oracle授权缺失,导致DBMS_SCHEDULER报错ORA-27486,即使GRANT CREATE JOB和CREATE EXTERNAL JOB已经被授予。

3
我缺少哪些额外的特权?
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>
3个回答

3
根据TFM,PURGE_LOG需要MANAGE SCHEDULER权限:
GRANT MANAGE SCHEDULER TO xxx;

3

哇,我找到了问题所在... "myJob"是数据库中现有的包对象。我猜我的“权限不足”是因为要用作业对象替换包对象。


命名空间并不总是我们所期望的那样... 我写了一本关于此的书(《精通Oracle调度程序》),但我经常忘记...;-) - user123664

0

如果您获得了管理调度程序的特权,下一个可能失败的地方是shell脚本上不存在的执行位。如果执行位已经存在,则会因缺少运行SQL * Plus所需的环境设置(如PATH和ORACLE_HOME)而失败。

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

关于这个主题有一些非常好的阅读材料,可以查看我的个人资料。

希望这可以帮助您, 罗纳德。


我通过将我的脚本作为参数传递给/bin/bash来避免在shell脚本上缺少“执行位”。 - dacracot
是的,你说得对,我漏掉了,抱歉。由于你的作业在一个非常空的环境中启动,所以你仍然需要注意环境设置。 - user123664

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接