【问题标题】:Oracle: Stop trigger for some timeOracle:停止触发器一段时间
【发布时间】:2014-01-08 12:33:57
【问题描述】:

我创建了一个触发器,我想在一段时间内停止触发器执行其代码。 oracle 中是否有任何可用的功能。

更具体:- 在 oracle 应用程序中创建 PO 时,我必须执行一项操作。 我需要找到这个 po 的申请号,我将通过加入分布和行表来获得。但是当触发触发器时,行和分布表中不会有任何数据。

【问题讨论】:

  • 你的意思是,你想在触发器开始执行之前设置一个时间延迟?
  • 是的,你可以这么说...我想延迟我的触发器正在调用的程序调用。
  • 我想在一个表中插入数据时执行一些操作。为此,我创建了一个触发器。现在当数据被插入到这个表中时,有一些相关数据正在插入到其他相关表中。我在通过触发器调用的过程中获取它,结果我得到 no_data_found。
  • 鉴于你上面描述的这种情况,你怎么知道你应该推迟多久触发? 10秒后相关数据还没有录完怎么办?
  • 如果其他处理一直在发生,则将所有相关任务放在一个过程中。根据它在做什么,触发动作可以在同一个过程中移动;或者触发表上的插入可能是您在过程中做的最后一件事?

标签: sql oracle plsql oracle11g


【解决方案1】:
alter trigger <trigger_name> disable;

然后启用

alter trigger <trigger_name> enable;

您不能延迟触发器,只要您在桌子上执行事件,它就会触发。

【讨论】:

    【解决方案2】:

    没有本地数据库方法可以将触发器延迟某个指定的时间段。

    一般情况下,您可以使用启用或禁用触发器,

    ALTER TRIGGER trigger_name ENABLE/DISABLE;
    

    您可以在存储过程中编写此代码,然后使用一些数据库外程序执行它,例如支持时间驱动执行的 PHP、JAVA、SHELL 等(取决于您的架构)

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 这可以添加到触发器代码中,但它只会在触发器被触发时执行。 OP 的问题是停止执行触发器。
      • 啊,我没有更新以查看有关该问题的更多 cmets。所以,这没有用。
      【解决方案4】:

      您可以通过创建作业轻松延迟操作。

      例如,您的触发器可能会调用 DBMS_JOB.submit 来创建要在特定时间(例如当前时间后 10 分钟)运行的作业。需要使用需要运行的过程的名称来创建作业。例如,您可以创建一个将记录 ID 作为参数的过程。

      DBMS_JOB 的好处在于它是事务性的 - 因此,如果您的触发语句被回滚,作业也将被回滚。

      缺点是在创建它的语句被提交之前,该作业永远不会开始。

      【讨论】: