5

我读过一本书,例如,Pro SQL Server 2008 Relation Database Design And Implementation Lois Davidson,在那里我发现了检查@@rowcount触发器内部的建议if it is = 0 then return::

if @@rowcount = 0 return

我想知道是否修改了 no 行如何触发触发器?

4

3 回答 3

6

触发器为正在运行的语句触发。即使表为空,或者语句不影响任何行,它也会触发:

create table tr (i int);
go

create trigger g on tr after update
as 
print 'foo'
go


update tr set i = 2

@Muflix 更新:

create table tr (i int);
go

create trigger g on tr after insert
as 
print 'foo'
go

insert into tr select * from tr;
go

如您所见,即使没有插入任何行,触发器也会触发。

于 2013-01-17T08:38:35.963 回答
2

因为Trigger无法知道触发事件影响了多少行,这就是您必须检查内部的原因。

于 2013-01-17T08:37:06.990 回答
1

触发事件被触发,因为触发事件已经发生。触发器不检查有多少行受到影响。因此,您必须检查@@rowcount 触发器体内。要触发触发器,触发事件很重要,而不是受影响的行数。

另请注意,@@rowcount当 SQL Server 2008 中的 MERGE 语句触发时,触发器中的行为与预期不同,并且有所不同。

于 2013-01-17T08:44:02.583 回答