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

Luí*_*ade 10 trigger sql-server dml

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

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

Microsoft Docs on DML Triggers 中使用的语言似乎与此行为相矛盾:

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

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

ype*_*eᵀᴹ 25

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

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

  • 语句触发器在INSERT / UPDATE / DELETE执行语句时触发。如果没有行受到影响也没关系。语句级别触发器无论如何都会触发,并且对于一个语句只触发一次(无论是 0、100 还是 10 亿行受影响)。

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

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

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


* SQL ServerCREATE TRIGGER文档状态:

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