Sql-Server

儘管沒有行受到影響,仍觸發觸發

  • August 15, 2018

這是一個更普遍的問題,但這個問題的動機是我在使用 SQL Server 時遇到的問題。

我將此觸發器附加到包含一些邏輯的表上的 Insert 事件,作為副作用,如果沒有插入行,則會引發錯誤。經過進一步調查,我發現儘管沒有插入任何行,但觸發器仍在觸發。

Microsoft Docs on DML Triggers中使用的語言似乎與此行為相矛盾:

DML 觸發器是一種特殊類型的儲存過程,當發生影響觸發器中定義的表或視圖的 DML 事件時,它會自動生效。

這是跨 DBMS 的預設行為嗎?當沒有行受到影響時,是否有特定的理由觸發觸發器?

對於 DML 操作,有基於行和基於語句的觸發器。

  • 當每行受到影響(插入/更新/刪除)時(之前、之後或代替),行觸發器會觸發。因此,如果 100 行受到影響,它們將觸發 100 次,如果 0 行受到影響,則根本不會觸發。
  • 執行語句時觸發語句觸發器INSERT / UPDATE / DELETE。如果沒有行受到影響,則無關緊要。無論如何,語句級觸發器都會觸發一次,並且只針對一個語句觸發一次(無論是 0、100 還是十億行受影響)。

一些 DBMS 只有行級觸發器 (MySQL)。

其他的(比如你的 DBMS 的 SQL Server *)只有語句級觸發器。

其他一些(DB2、Oracle、Postgres)有這兩種觸發器。


DML 觸發器在使用者嘗試通過數據操作語言 (DML) 事件修改數據時執行。DML 事件是表或視圖上的INSERTUPDATEDELETE語句。這些觸發器在任何有效事件被觸發時觸發,無論是否有任何表行受到影響。

引用自:https://dba.stackexchange.com/questions/214777