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事件
INSERT,UPDATE或DELETE表或视图的语句。无论是否有任何表行受到影响,当触发任何有效事件时都会触发这些触发器。