我注意到一种非常奇怪的行为。 如果我创建一个insert-select语句并且select部分没有返回数据,则插入部分仍然执行,甚至调用insert trigger(在插入触发器中插入的伪插入中有0行)。
示例:
insert into table1 column1
select column1 from table2 where condition = 'Never met'
输出:
(0 row(s) affected) // 0 rows inserted
(1 row(s) affected) // log from trigger
可能是由'通用'触发器引起的(一次声明FOR INSERT,UPDATE,DELETE)? 我知道这更像是假设性问题,我必须接受这种行为。但为什么会这样呢?对我来说完全是无稽之谈。 我正在使用SQL Server 2005.
- kwitee
答案 0 :(得分:8)
因为他们documented这样做了吗?
当用户尝试通过数据操纵语言(DML)事件修改数据时,DML触发器执行。 DML事件是表或视图上的INSERT,UPDATE或DELETE语句。触发任何有效事件时会触发这些触发器,无论是否有任何表行都受到影响。
(我的重点)
也许这没有多大意义,但也许微软会花费更多的时间和开发工作来创建一个特殊的代码路径,当它证明没有行受影响时会抑制触发器。
这只是另一个需要仔细设计触发器以处理可能包含0行,1行或多行的inserted
和deleted
的示例。
(另外,从关系的角度来看,不包含元组的集合有时仍然很有趣)
答案 1 :(得分:0)
只要与表关联的事件发生(例如,插入,更新或删除)而不是select语句,就会执行或触发SQL触发器。重新触发触发器以确保更新或插入或删除表。
此致 sa.va3feb