【发布时间】:2011-03-08 06:55:45
【问题描述】:
我有一个 TABLE1。在这张表上,我创建了一个触发器:AFTER INSERT OR UPDATE OR DELETE
现在,如果我执行一个不插入任何内容的插入操作,触发器仍然会被触发:
insert into TABLE1 select * from TABLE1 where 1=0;
此查询将插入 NO ROWS,但仍会触发触发器。
有没有办法避免这种情况?这是正常行为吗?
【问题讨论】:
我有一个 TABLE1。在这张表上,我创建了一个触发器:AFTER INSERT OR UPDATE OR DELETE
现在,如果我执行一个不插入任何内容的插入操作,触发器仍然会被触发:
insert into TABLE1 select * from TABLE1 where 1=0;
此查询将插入 NO ROWS,但仍会触发触发器。
有没有办法避免这种情况?这是正常行为吗?
【问题讨论】:
是的,这是正常行为。可以避免,但这样做需要 3 个触发器:
听起来有点矫枉过正?也许是:你的触发器要达到什么目的?
【讨论】:
这是正常行为,Oracle 期望插入行,因此即使没有插入行,它也会触发 BEFORE INSERT 和 AFTER INSERT 触发器。 AFTER 触发器的目的之一是在语句成功后执行某些操作。此语句成功:)
您可以计算受包变量影响的行数:
mypackage.table1_nb_ins 变量设置为 0如果您的计数器大于 0,然后执行您的 AFTER INSERT 逻辑
【讨论】:
行触发器
每次表受到触发语句的影响时,都会触发行触发器。例如,如果 UPDATE 语句更新表的多行,则为受 UPDATE 语句影响的每一行触发一次行触发器。如果触发语句不影响任何行,则不会运行行触发器。
https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm
【讨论】: