为什么在没有要插入的数据时调用插入触发器?

kwi*_*tee 4 sql-server sql-server-2005

我注意到一种非常奇怪的行为.如果我创建一个insert-select语句并且select部分没有返回数据,则插入部分仍然执行,甚至调用insert trigger(在插入触发器中插入的伪插入中有0行).

例:

insert into table1 column1
select column1 from table2 where condition = 'Never met'
Run Code Online (Sandbox Code Playgroud)

输出:

(0 row(s) affected) // 0 rows inserted
(1 row(s) affected) // log from trigger
Run Code Online (Sandbox Code Playgroud)

可能是由'通用'触发器引起的(一次声明FOR INSERT,UPDATE,DELETE)?我知道这更像是假设性问题,我必须接受这种行为.但为什么会这样呢?对我来说完全是无稽之谈.我正在使用SQL Server 2005.

- kwitee

Dam*_*ver 8

因为他们有记录这样做?

当用户尝试通过数据操纵语言(DML)事件修改数据时,DML触发器执行.DML事件是表或视图上的INSERT,UPDATE或DELETE语句.无论是否有任何表行受到影响,触发任何有效事件时都会触发这些触发器.

(我的重点)

也许这没有多大意义,但也许微软会花费更多的时间和开发工作来创建一个特殊的代码路径,当它证明没有行受到影响时会抑制触发器.

这只是另一个需要仔细设计触发器来处理inserteddeleted可能包含0,1或多行的示例.


(另外,从关系的角度来看,不包含元组的集合有时仍然很有趣)