安排将作为特定用户运行的作业

时间:2013-10-24 12:33:23

标签: oracle scheduler

我正在尝试创建一个作为特定用户运行存储过程的作业,我可以创建并提供有限权限以仅执行所需操作。

根据我的阅读,我需要创建用户(非常标准),然后通过执行来创建凭证条目;

dbms_scheduler.create_credential('[cred name]', '[Oracle User]', '[Oracle Password]');

创建凭据后,我尝试在作业创建脚本中使用它;

dbms_scheduler.create_job(
      job_name => 'myJobName',
      job_type => 'stored_procedure',
      job_action => 'myStoredProcedure',
      credential_name => 'jobRunningUserCredential',
      destination_name => NULL);

我遇到的问题是,当运行此问题时,我收到以下错误消息;

ora-27351 conflicting values of job attributes credential_name and job_type

我想知道是否有人能看到我错过的东西,或者我是否只是用这种方法咆哮错误的树,在这种情况下欢迎提出任何建议。

提前感谢您的任何帮助/建议。

萨姆

更新

收到使用alter_chain的建议后,我实现了以下代码;

dbms_scheduler.create_chain('myjob_chain', NULL, NULL, NULL);
dbms_scheduler.define_chain_step('myjob_chain', 'step_name', 'schemaName');
dbms_scheduler.define_chain_step('myjob_chain', 'parallel_instances', 'schemaName');
dbms_scheduler.define_chain_step('myjob_chain', 'enable_job', 'schemaName');
dbms_scheduler.enable('myjob_chain');

dbms_scheduler.alter_chain('myjob_chain', 'step_name', 'credential_name', 'myCredential');
dbms_scheduler.create_job(
      job_name => 'myJobName',
      job_type => 'stored_procedure',
      job_action => 'myStoredProcedure',
      credential_name => 'jobRunningUserCredential',
      destination_name => NULL);
dbms_output.put_line('job created');

dbms_scheduler.alter_chain('myjob_chain', 'set_parallel_instances', 'credential_name', 'myCredential');
dbms_scheduler.set_attribute(
    name => 'myJobName',
    attribute => 'parallel_instances',
    value => TRUE);
dbms_output_put_line('parallel_instances');

dbms_scheduler.alter_chain('myjob_chain', 'enable_job', 'credential_name', 'myCredential');
dbms_scheduler.enable(name => 'myJobName');
dbms_output_put_line('enable');

这给我的输出是;

job created
parallel_instances
BEGIN
*
ERROR at line 1:
ORA-27351: conflicting values of job attributes CREDENTIAL_NAME and JOB_TYPE
ORA-06512: at "SYS.DBMS_ISCHED", line 4395
ORA-06512: at "SYS.DBMS_SCHEDULER", line 2803
ORA-06512: at line 67

非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

如果您想以特定用户身份运行作业,

  • 为特定操作系统创建凭证而不是数据库(因为凭证指向操作系统而不是数据库)

创建凭证

BEGIN
    dbms_scheduler.create_credential(
       username => 'OS Username',
        password => 'OS password',
        credential_name => 'TEST_CREDENTIAL'
    );
END; 

创建作业

   dbms_scheduler.create_job(
      job_name => 'myJobName',
      job_type => 'stored_procedure',
      job_action => 'myStoredProcedure',
      credential_name => 'TEST_CREDENTIAL',
      destination_name => NULL);

现在运行工作..

答案 1 :(得分:0)

  

您可能想要做的是为步骤设置凭据。

     

您可以使用alter_chain在特定步骤中执行此操作   属性设置为credential_name

     

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_sched.htm#CHDIAICJ

Credit: Ravi

答案 2 :(得分:0)

如果要让该作业在userm下运行,例如AJAX-您必须在该用户下创建该作业。为此,您必须授予他CREATE JOB特权。

根据Oracle的documentaion凭据创建一个用户/密码信息的容器,该信息将由Ora调度程序传递给外部程序。

因此,您的初始脚本有一个误解性的问题,尝试创建具有凭证的作业(具有用于调用 external 程序的参数),同时使用job_type =>'stored_procedure'(和 stored_procedure 是用于调用内部pl / sql过程的作业类型。