首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提前从触发器返回,以便跳过逻辑

问提前从触发器返回,以便跳过逻辑
EN

Stack Overflow用户
提问于 2019-10-01 02:31:43
回答 2查看 286关注 0票数 0

我想跳过在表更新时调用的触发器。我知道如果更新后的行的UserID低于某个ID,我就可以跳过它。

inserted表可以有多行,什么时候会有多行?由于触发器在update上触发,触发器不会为update中的每一行调用吗?

下面的SQL忽略触发器是否正确。如果ID小于123,我希望触发器只执行RETURN操作,并跳过它通常执行的逻辑:

代码语言:javascript
复制
DECLARE @UserID AS INT = (SELECT UserID FROM Inserted)
IF @UserID <= 123
BEGIN
    RETURN
END
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 02:34:36

SQL Server triggers每条语句触发一次,而不是每行触发一次。一条语句可以影响任意数量的行。

因此,您必须执行常规的触发器逻辑,并且不对任何具有UserId <= 123的行执行任何操作。

票数 2
EN

Stack Overflow用户

发布于 2019-10-01 03:27:25

如果您毫不怀疑地知道正在更新的所有行都将包含相同的UserID,则可以使用以下命令作为触发器的快捷方式:

代码语言:javascript
复制
if exists (select 1 from Inserted where UserId <= 123) return;

这可能非常危险,因为如果存在同时包含UserId <= 123和UserId > 123的混合更新,触发器将不会对那些> 123的更新运行。考虑一下,虽然您的应用程序可能永远不会这样做,但DBA可能会从SSMS手动更正一些数据。

处理这种情况的正确方法如下:

代码语言:javascript
复制
declare @Id int, @UserId int;
declare @Rows table (Id int, UserId int);

insert into @Rows (Id, UserId)
  select Id, UserId from Inserted;

while exists (select 1 from @Rows) begin
  select top 1 @Id = Id, @UserId = UserId from @Rows;
  if @UserId > 123 begin
    -- Do stuff
  end
  delete from @Rows where Id = @Id;
end

应该注意的是,在可能的情况下,您应该避免这种基于行的活动,因为它是一种反数据库模式,可能会导致性能问题。理想情况下,所有数据库操作都是基于设置的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58173387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档