"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
我正在使用 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