2

「ADMUSER」という名前の Oracle データベース ユーザーがいて、次の権限があります。これは、私の理解によると、データベース ジョブを作成するために必要な権限です。[Oracle データベースのバージョンは Oracle 10g 10.2.0.4]

CREATE JOB
CREATE ANY JOB
CREATE EXTERNAL JOB
MANAGE SCHEDULER

しかし、DBMS_SCHEDULER.create_job メソッドを呼び出すストアド プロシージャを呼び出そうとすると、権限が不十分であるというエラーが発生します。

ストアド プロシージャ:

   PROCEDURE prod_dispatch_main_job (l_max_job    IN NUMBER,
                                     l_interval   IN NUMBER,
                                     l_freq       IN VARCHAR2)
   BEGIN
         DBMS_SCHEDULER.create_job (
            job_name          => 'PROD_DISPATCH_JOB',
            job_type          => 'PLSQL_BLOCK',
            job_action        =>    'BEGIN PROD_Procedures.prod_run_user_job('
                                 || l_max_job
                                 || '); END;',
            start_date        => SYSTIMESTAMP,
            repeat_interval   =>    'freq='
                                 || l_freq
                                 || ';interval='
                                 || l_interval,
            job_class         => 'CONSOLIDATE_CLASS',
            enabled           => TRUE,
            auto_drop         => FALSE);
   END;

以下のように、SQL開発者を使用してこのSPを実行しました(Java jdbcを使用して「{call PROD_Procedures.prod_dispatch_main_job(?,?,?)}」のように呼び出したときに機能しなかったため、このように実行しようとしました)。

begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;

その後、次のエラーが発生しました。

Error starting at line 7 in command:
begin
prod_procedures.prod_dispatch_main_job(1,10,'minutely');
end;
Error report:
ORA-27486: insufficient privileges
ORA-06512: at "SYS.DBMS_ISCHED", line 99
ORA-06512: at "SYS.DBMS_SCHEDULER", line 262
ORA-06512: at "ADMUSER.PROD_PROCEDURES", line 422
ORA-06512: at line 2
27486. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to perform a scheduler operation without the
           required privileges.
*Action:   Ask a sufficiently privileged user to perform the requested
           operation, or grant the required privileges to the proper user(s).

行 422 には、"DBMS_SCHEDULER.create_job"... 文字列が含まれています。しかし、前述したように、「session_privs」テーブルを確認すると、このユーザーが上記の権限を持っていることがわかります。誰でもこの問題を解決するのを手伝ってもらえますか?


更新: create_job 関数の job_class の値を「DEFAULT_JOB_CLASS」に置き換えました。その後、問題なく動作します。したがって、このユーザーには「CONSOLIDATE_CLASS」ジョブ クラスにアクセスする権限が必要だと思います。このジョブクラスでこのユーザーに付与された権限をデータベースで確認する方法を教えてください。オブジェクトに付与された権限を確認するには、どの表を参照すればよいですか?

権限を付与する前に、このユーザーが「CONSOLIDATE_CLASS」に対する実行権限を持っていないことを確認する必要があります。

4

2 に答える 2

3

呼び出すときに、パラメーターDBMS_SCHEDULER.create_job(...)の値を指定しjob_classます。

ユーザーがこのクラスに属するジョブを作成するには、ジョブ クラスに対するEXECUTE権限が必要です (ドキュメント リンク):CONSOLIDATE_CLASS

grant execute on user_who_owns_class.CONSOLIDATE_CLASS to user_who_creates_job

アップデート

ユーザーがこのクラスでジョブを作成することを許可されているかどうかを確認するには、次のall_tab_privsビューを参照してください。

select count(1) 
from all_tab_privs 
where 
  table_name = 'PROD_DISPATCH_JOB' 
  and 
  table_schema = upper('<job class owner name here>')
  and
  privilege = 'EXECUTE'
  and 
  grantee in (
    select 'PUBLIC' from dual  -- granted to public
    union 
    select upper('<current_user_name_here>') from dual -- direct grant
    union
    select role from session_roles  -- roles enabled for current session
  )
于 2013-07-01T14:24:20.483 に答える