我想跳过在表更新时调用的触发器。我知道如果更新后的行的UserID低于某个ID,我就可以跳过它。
inserted表可以有多行,什么时候会有多行?由于触发器在update上触发,触发器不会为update中的每一行调用吗?
下面的SQL忽略触发器是否正确。如果ID小于123,我希望触发器只执行RETURN操作,并跳过它通常执行的逻辑:
DECLARE @UserID AS INT = (SELECT UserID FROM Inserted)
IF @UserID <= 123
BEGIN
RETURN
END发布于 2019-10-01 02:34:36
SQL Server triggers每条语句触发一次,而不是每行触发一次。一条语句可以影响任意数量的行。
因此,您必须执行常规的触发器逻辑,并且不对任何具有UserId <= 123的行执行任何操作。
发布于 2019-10-01 03:27:25
如果您毫不怀疑地知道正在更新的所有行都将包含相同的UserID,则可以使用以下命令作为触发器的快捷方式:
if exists (select 1 from Inserted where UserId <= 123) return;这可能非常危险,因为如果存在同时包含UserId <= 123和UserId > 123的混合更新,触发器将不会对那些> 123的更新运行。考虑一下,虽然您的应用程序可能永远不会这样做,但DBA可能会从SSMS手动更正一些数据。
处理这种情况的正确方法如下:
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应该注意的是,在可能的情况下,您应该避免这种基于行的活动,因为它是一种反数据库模式,可能会导致性能问题。理想情况下,所有数据库操作都是基于设置的。
https://stackoverflow.com/questions/58173387
复制相似问题