5

我注意到一种对我来说非常奇怪的行为。如果我做了一个插入选择语句并且选择部分没有返回数据,插入部分仍然执行,甚至调用插入触发器(在插入触发器中,插入的伪表中有 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。

——奎蒂

4

2 回答 2

9

因为他们有记录这样做?

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

我的重点

也许这没有什么意义,但微软可能会花费更多的时间和开发精力来创建一个特殊的代码路径,当事实证明没有受影响的行时抑制触发器。

这只是另一个示例,您需要仔细设计触发器以处理inserteddeleted可能包含 0、1 或许多行。


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

于 2013-03-13T08:37:16.827 回答
0

每当发生与表相关联的事件(例如,插入、更新或删除而不是 select 语句)时,就会执行或触发 SQL 触发器。重写触发器以确保表已更新、插入或删除。

问候, sa.va3feb

于 2013-03-13T08:48:27.020 回答