【问题标题】:How to prevent an Insert Trigger from being fired when no row is inserted?没有插入行时如何防止触发插入触发器?
【发布时间】:2011-03-08 06:55:45
【问题描述】:

我有一个 TABLE1。在这张表上,我创建了一个触发器:AFTER INSERT OR UPDATE OR DELETE

现在,如果我执行一个不插入任何内容的插入操作,触发器仍然会被触发:

insert into TABLE1 select * from TABLE1 where 1=0;

此查询将插入 NO ROWS,但仍会触发触发器。

有没有办法避免这种情况?这是正常行为吗?

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    是的,这是正常行为。可以避免,但这样做需要 3 个触发器:

    1. 将包布尔变量设置为 FALSE 的 BEFORE 触发器
    2. 一个 FOR EACH ROW 触发器,用于在插入行时将变量设置为 TRUE
    3. 您拥有的 AFTER 触发器,现在您可以在其中检查变量的值,然后再执行其操作。

    听起来有点矫枉过正?也许是:你的触发器要达到什么目的?

    【讨论】:

    • 实际上,我刚刚添加了 FOR EACH ROW,它解决了我的问题。我只需要更新另一个表中的日期。即使为插入的每一行触发触发器,在这种情况下也没有关系,因为每次插入的行很少。但感谢您的回答。如果我有性能问题,我会尝试。
    【解决方案2】:

    这是正常行为,Oracle 期望插入行,因此即使没有插入行,它也会触发 BEFORE INSERT 和 AFTER INSERT 触发器。 AFTER 触发器的目的之一是在语句成功后执行某些操作。此语句成功:)

    您可以计算受包变量影响的行数:

    • 在 BEFORE INSERT 触发器中将 mypackage.table1_nb_ins 变量设置为 0
    • 在 AFTER INESRT FOR EACH ROW 触发器中增加计数器

    如果您的计数器大于 0,然后执行您的 AFTER INSERT 逻辑

    【讨论】:

      【解决方案3】:

      行触发器

      每次表受到触发语句的影响时,都会触发行触发器。例如,如果 UPDATE 语句更新表的多行,则为受 UPDATE 语句影响的每一行触发一次行触发器。如果触发语句不影响任何行,则不会运行行触发器。

      https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm

      【讨论】:

        猜你喜欢
        • 2017-04-26
        • 2011-05-14
        • 1970-01-01
        • 2021-09-25
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        相关资源
        最近更新 更多