【问题标题】:How to create a trigger on user_scheduler_jobs in oracle?如何在 oracle 中的 user_scheduler_jobs 上创建触发器?
【发布时间】:2012-03-22 19:45:15
【问题描述】:

我是甲骨文的新手。在我们的应用程序中,当计划作业的运行时间超过 10 分钟时,我们需要执行一个过程。我们正在签入user_scheduler_jobs 表并且必须在last_run_duration 列超过10 分钟时触发一个过程。我们尝试为此创建一个触发器,如下所示:

CREATE TRIGGER TRG1
  AFTER UPDATE ON ALL_SCHEDULER_JOBS
  BEGIN
  MONITOR_JOB_DURATION();
  END TRG1;

但是当我尝试编译触发器时,它显示错误为

Error report:
ORA-25001: cannot create this trigger type on views
25001. 00000 -  "cannot create this trigger type on views"
*Cause:    Only INSTEAD OF triggers can be created on a view.
*Action:   Change the trigger type to INSTEAD OF.

user_scheduler_jobs 是视图吗? 如果我继续使用INSTEAD OF 触发器,它会影响作业执行后自动发生的更新吗?

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    user_scheduler_jobs 是视图吗?它肯定是。更重要的是,它在 SYS 模式中,你真的不应该试图弄乱那个模式。它对数据库的运行至关重要,应完全按照 Oracle 安装的方式保存。


    Oracle Enterprise Manager 具有一些监控作业的功能。在开始自己制作之前,您是否看过它?

    【讨论】:

    • +1,绝对是;更改 sys 是导致问题的最可靠方法。
    • 很抱歉,我对 Oracle Enterprise Manager 一无所知。我将尝试对此进行调查。感谢您提供宝贵的信息。
    【解决方案2】:

    处理这个问题的最好方法是检查你的代码运行了多长时间,然后做一些事情。正如APC 所说,绝不要开始在 SYS 模式中放置触发器或其他任何东西,你会造成更多的麻烦,这是值得的。像下面这样的东西应该可以工作:

    declare
    
       l_start_time date default sysdate;
    
       -- other stuff
    
    begin
    
      -- do something
    
      if sysdate - l_start_time > ( 1 / 24 / 6 )
         -- run something else
         -- maybe using dbms_scheduler
      end if;
    
      -- do more stuff
    
    end;
    

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 2021-04-05
      • 2013-12-24
      • 2018-02-07
      • 2011-06-21
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多