TSQL 2012 删除了 INSTEAD OF 和 AFTER 触发器中的表?

Bog*_*nov 1 trigger sql-server-2012

我的同事问我很简单,但对我来说很难的问题:

如果我deletedINSTEAD OF触发器中有 10 条记录的表并且我删除了其中的 8 条记录,那么我deletedAFTER触发器中的表中有多少条记录?

我认为它应该是 10,但我不确定。

Mar*_*ith 5

非常容易测试。

CREATE TABLE T(X INT);

GO

INSERT INTO T 
SELECT TOP 10 1
FROM sys.all_objects;

GO

CREATE TRIGGER TR1 ON T INSTEAD OF DELETE AS DELETE TOP (8) FROM T;

GO

CREATE TRIGGER TR2 ON T AFTER DELETE AS SELECT COUNT(*) FROM DELETED;

GO

DELETE FROM T;


DROP TABLE T;
Run Code Online (Sandbox Code Playgroud)

答案8

这是正确的行为。after 触发器应反映实际删除的行。如果您有一个审计触发器记录了 10 次删除,而只有 8 次发生,这显然是不正确的。