"Instead of delete trigger" 触发两次

"Instead of delete trigger" triggers two times

我正在使用 MS SQL Server 2016,其中我实施了 instead of delete 触发器。它看起来像这样:

ALTER TRIGGER MyTrigger ON MyTable INSTEAD OF DELETE AS 
BEGIN
    IF --some condition
    BEGIN
        RAISERROR ('Error msg', 16, 1)
        ROLLBACK TRAN
        RETURN
    END
    DELETE MyTable FROM MyTable JOIN deleted ON MyTable.id = deleted.id
END

如果我在 table 'MyTable' 上执行 DELETE 语句并且 if 中的条件不满足 DELETE 语句在 if 块之后执行.这是绝对正确的。但是在 SSMS 的控制台中,执行了 DELETE 语句两次。于是在控制台写了如下内容:

(1 rows affected)
(1 rows affected)

我不明白为什么。为什么 SSMS 两次指示某行受到影响?我使用 SSMS 版本 15.0.18338.0.

这是因为有2组数据作用,一组在TRIGGER外面,然后又在里面,因为初始数据集本身不执行DML操作。如果您不想看到后者的计数,请将 NOCOUNT 转为 ON。当然,这意味着如果在您的 TRIGGER 中受到影响的行较少,您将不会在 SSMS 的输出中知道它(但它只是提供信息)。

还强烈建议您不要在 TRIGGER 内使用 ROLLBACK,在 TRIGGER 处理交易,不要里面。 RAISERROR 也不推荐,您应该使用 THROW 进行新的开发工作(自 2012 年以来一直推荐!)。这导致 TRIGGER 如下所示:

CREATE OR ALTER TRIGGER MyTrigger ON dbo.MyTable INSTEAD OF DELETE AS 
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT 1 FROM deleted WHERE SomeVal = 'Nonsense')
        THROW 95302, N'Error Msg', 16; --Use an error number appropriate for you
    ELSE
        DELETE MT FROM dbo.MyTable MT JOIN deleted ON MT.id = deleted.id;
END;
GO