Sql-Server
儘管沒有行受到影響,仍觸發觸發
這是一個更普遍的問題,但這個問題的動機是我在使用 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)有這兩種觸發器。
- SQL Server
CREATE TRIGGER
文件狀態:DML 觸發器在使用者嘗試通過數據操作語言 (DML) 事件修改數據時執行。DML 事件是表或視圖上的
INSERT
、UPDATE
或DELETE
語句。這些觸發器在任何有效事件被觸發時觸發,無論是否有任何表行受到影響。