在触发器中检查@@rowcount = 0 的目的?
Posted
技术标签:
【中文标题】在触发器中检查@@rowcount = 0 的目的?【英文标题】:Purpose of checking @@rowcount = 0 in a trigger? 【发布时间】:2013-01-17 08:33:24 【问题描述】:我读过一本书,例如 Pro SQL Server 2008 关系数据库设计和实现 Lois Davidson,我在其中找到了检查触发器内的 @@rowcount
的建议:if it is = 0 then return
:
if @@rowcount = 0 return
我想知道是否修改了 no 行是如何触发触发器的?
【问题讨论】:
【参考方案1】:触发器为正在运行的 语句 触发。即使表为空,或者语句不影响任何行,它也会触发:
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
正如您所见,即使没有插入任何行,触发器也会触发。
【讨论】:
在插入触发器中检查这一点也很重要?【参考方案2】:因为Trigger
无法知道有多少行受到触发事件的影响,所以您必须检查内部。
【讨论】:
一个触发器可以做SELECT COUNT(*) FROM [inserted]
虽然:docs.microsoft.com/en-us/sql/relational-databases/triggers/…【参考方案3】:
触发器被触发,因为触发事件已经发生。触发器不
检查有多少行受到影响。因此你必须检查@@rowcount
扳机体内。要触发触发器,触发事件很重要,并且
不是受影响的行数。
另请注意,当 SQL Server 2008 中的 MERGE 语句触发时,触发器中 @@rowcount
的行为与预期不同,并且有所不同。
【讨论】:
以上是关于在触发器中检查@@rowcount = 0 的目的?的主要内容,如果未能解决你的问题,请参考以下文章
SQLAlchemy ResultProxy.rowcount 不应为零