1

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

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

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

非常感谢任何建议。

4

3 回答 3

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);

现在运行作业..

于 2014-03-17T10:16:45.090 回答
0

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

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

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

信用:拉维

于 2013-10-24T12:38:38.077 回答
0

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

根据 Oracle 的文档,凭据被创建为用于将由 Ora 调度程序传递给外部程序的用户/密码信息的容器。

因此,您的初始脚本有一个误解问题,试图创建一个带有凭据的作业(即带有调用外部程序的参数),同时使用 job_type => 'stored_procedure' (并且stored_procedure是调用内部 pl/ 的作业类型sql 程序)。

于 2019-07-10T11:19:41.050 回答