SQL Server触发器事件触发问题

时间:2013-02-16 06:33:11

标签: sql sql-server

我在表格上有一个触发器:

ALTER TRIGGER [shoot_sms] 
  ON  [dbo].[MyTable]
 AFTER  INSERT
AS
begin
declare @number bigint
declare @body varchar(50)
declare @flag int

select @number=number,@body=body,@flag=flag from inserted

if(@flag=0)
begin

insert into temptable (number,body,status)
select @number,@body,'P'

end
end

现在我在mytable中输入两个条目如下:

insert into mytable(number, body, flag)
values(3018440225, 'This is test', 0)

insert into mytable(number, body, flag)
values(3018440225, 'This is test', 0)

我一次执行这些查询,但对于这两个查询,触发器只触发一次并仅执行第一个查询的任务。

如何使其适用于两个插入语句?

2 个答案:

答案 0 :(得分:2)

只是一个想法,但在这两个插入语句之间放置一个GO语句,这可能会导致触发器触发两次。

你应该重写你的触发器来处理我认为的多行插入。

这是您转换的查询。你现在应该得到两行。

ALTER TRIGGER [shoot_sms] 
  ON  [dbo].[MyTable]
 AFTER  INSERT
AS
begin


insert into temptable (number,body,status)
select number,body,'P'
from inserted
where flag = 0

end

另请注意,您的触发器现在要简单得多。

答案 1 :(得分:1)

由于这两个语句都在一个SQL批处理中,触发器 (按设计)只触发一次。

触发器每行不会触发一次 - 每次声明触发一次!因此,如果您有一个影响多行的INSERTUPDATE语句,则您的触发器将在Inserted(可能还有Deleted)伪表中有多行

您编写此触发器的方式实际上是,考虑到Inserted可能包含多行 - 如果您是Inserted表,请从哪个行中选择一次插入20行?

select @number = number, @body = body, @flag = flag from inserted

您需要更改触发器才能将其考虑在内!