【问题标题】:Delaying the trigger invocation after an insert oracle在插入 oracle 之后延迟触发器调用
【发布时间】:2011-03-19 23:00:36
【问题描述】:

有没有办法做到这一点?我发现添加,

DBMS_LOCK.sleep() 

通过谷歌搜索到触发代码的开头,但它会阻止插入本身发生。我想插入数据,但触发器只能在任意延迟后触发。谢谢。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    如果我们知道为什么你想要这个延迟,以及触发器应该在延迟之后做什么,那将会很有帮助。但是,一种可能性是在触发器中使用DBMS_JOB 包来创建一个在插入后不久运行的作业。例如:

    create trigger trg
    after insert on tab
    for each row
    declare
      jl_ob number;
    begin
      dbms_job.submit
        ( job => l_job
        , what => 'myproc(:new.id);'
        , next_date => sysdate+1/24/60 -- One minute later
        );
    end;
    

    或者,触发器可以将一行插入到一个特殊的表中,以及一个按计划运行的 DBMS_JOB,例如每 10 分钟可以处理表中超过 X 分钟的行。

    【讨论】:

    • 在 10g 及更高版本中,您将使用 DBMS_SCHEDULER。此外,DBMS_JOB/DBMS_SCHEDULER 的调用是由事务控制的,所以在事务提交之后才会调度作业,这与插入行之后是不同的。
    • 不错,以后一定要学会说DBMS_SCHEDULER!至于事务控制,可以选择使用自治事务 IFF,即使触发语句回滚,作业运行也没有关系。我会说它必须是其中之一。
    • 实际上,在使用 DBMS_SCHEDULER 进行研究时,我发现它执行隐式提交,这意味着它不能用于您希望它执行可能回滚的事情的情况。至于 DBMS_JOB 被弃用(确实如此),Tom Kyte 今年表示:“我只能说看到 [DBMS_JOB] 消失我会非常惊讶,如果我收到没有它的测试版......”(asktom.oracle.com/pls/apex/…)。所以我会保持原样。
    • Tom Kyte 还谈到 DBMS_SCHEDULR(在同一页中)说它“对于一次性工作来说可能有点“矫枉过正”。我喜欢汤姆的众多优点之一就是他令人耳目一新的实用主义!
    • 我的立场是正确的;我对 DBMS_JOB 提交要求有足够的了解,以至于我不知道 DBMS_SCHEDULER 中的隐式提交。但是,在触发器中调用它可能会导致尽可能多的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2011-12-06
    • 2017-09-15
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多