尽管没有任何行受到影响,但触发触发


10

这更像是一个普遍的问题,但是这个问题的动机是我在使用SQL Server时遇到的一个问题。

我将此触发器附加到表上的Insert事件中,该事件包含一些逻辑,作为副作用,如果没有插入行,它将引发错误。经过进一步调查,我发现尽管没有插入行,但触发器仍在触发。

在DML触发器上Microsoft文档中使用的语言似乎与以下行为矛盾:

DML触发器是一种特殊的存储过程,当发生DML事件而该事件会影响触发器中定义的表或视图时,它会自动生效。

这是DBMS的默认行为吗?没有行受到影响时,是否有特定的原因触发触发器?

Answers:


24

对于DML操作,有基于行和基于语句的触发器。

  • 当(插入,更新/删除)每行(之前,之后或代替)时,行触发触发。因此,如果影响100行,它们将触发100次,如果影响0行,则将根本不触发。

  • INSERT / UPDATE / DELETE执行语句时,语句触发触发。没影响的行无关紧要。无论如何,语句级别都会触发触发,并且一条语句只会触发一次(无论是0、100还是十亿行受影响)。

一些DBMS仅具有行级触发器(MySQL)。

其他(例如SQL Server *,这是您的DBMS)只有语句级别的触发器。

其他一些(DB2,Oracle,Postgres)具有这两种触发器。


* SQL Server CREATE TRIGGER文档状态:

当用户尝试通过数据操作语言(DML)事件修改数据时,将执行DML触发器。DML事件INSERTUPDATEDELETE表或视图的语句。当触发任何有效事件时,无论是否影响任何表行,这些触发器都会触发。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.