带有 INSERT 语句的 INSERT 触发器

Posted

技术标签:

【中文标题】带有 INSERT 语句的 INSERT 触发器【英文标题】:INSERT trigger which with the INSERT statements within 【发布时间】:2013-07-11 12:47:01 【问题描述】:

在某些情况下,将记录插入表中时,应将其拆分为几条记录,然后将其插入。

逻辑写在 INSERT 触发器中,该触发器在 INSERT 操作之前触发。在这个触发器内部,我试图执行一个 INSERT 语句,该语句随后会导致触发器的递归调用。但是我不希望这种情况发生。我尝试使用类似

的 smth 从其主体中禁用触发器

execute immediate 'ALTER TRIGGER sale_trigger DISABLE';

但是,显然这是一个提交操作,因此它在触发器内部不起作用。

如何绕过触发器的递归调用?

编辑 我将触发器声明为 declare PRAGMA AUTONOMOUS_TRANSACTION;,现在我可以运行 alter 语句。但是,当我从同一个触发器禁用触发器时 - PLSQL 开发人员停止工作。我该怎么办? :)

【问题讨论】:

也许有一种方法,你如何理解触发器是第二次被调用,例如从数据开始插入?所以你可以直接在触发器中检查这个,并且在第二次调用的情况下不会调用插入。 尚未找到一种方法来区分触发器是否是第一次被调用。在我的情况下,分析数据似乎没有帮助 我设法找到的唯一解决方法是目标表中的附加列具有一些默认值,这对于通过触发器插入的值会有所不同,因此触发器会检查它并且不会插入, 如果它不同于默认值。不过,这似乎不太好,尤其是如果您无法更改数据结构... 是的。有人建议我将所有逻辑从触发器移到一个单独的过程中,我可能会这样做 【参考方案1】:

不是将第一个插入直接加载到目标表中,而是将记录插入到临时表中。具有麻烦逻辑的触发器应该在暂存表上。如果逻辑不适用,则触发器将该行插入到目标表中。如果逻辑适用,触发器会插入行(如果有必要?)并触发对目标表的任何额外插入。定期截断临时表以使其保持小而高效(但可能不是在每次触发操作之后,因为这样效率会降低)。

换句话说:将触发器与其插入的表分离。

【讨论】:

以上是关于带有 INSERT 语句的 INSERT 触发器的主要内容,如果未能解决你的问题,请参考以下文章

在触发触发器以响应 INSERT 并且触发器执行另一个 INSERT 语句时使用 @@identity

对于INSERT BULK 命令, 怎么建立insert触发器

如何使用带有 WITH 子句的 INSERT 语句?

SQL Server - 在模式中触发AFTER INSERT表

C#中执行insert的SQL语句成功(返回受影响行数为1)却没有在数据库中insert,知道啥原因么?

oracle 如何返回当前序列值 比如我insert语句过后立刻要获取当前insert结果的序列值,怎么做,求救......