2013-02-16 33 views
0

我有一個表上的觸發器,是這樣的:問題與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) 

我執行這些查詢一次,但是對於這兩個查詢,觸發器只觸發一次並僅執行第一個查詢的任務。

如何使它適用於兩個插入語句?

+0

所以你的意思是,當向mytable插入兩條記錄時,只有一個條目被填充到表'temptable'中? – TechDo 2013-02-16 06:37:24

+0

是的。第一個條目始終填充。 – 2013-02-16 06:38:29

+0

插入時是否有異常? – TechDo 2013-02-16 06:44:38

回答

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 

另外注意你的觸發器現在更簡單了。

+0

實際上問題在於插入條目是由應用程序創建的。我不能做你所建議的。可以同時有5 6或數百個條目。 – 2013-02-16 06:42:21

+0

我怎麼寫它來處理多行?你能幫忙嗎? – 2013-02-16 06:43:09

+0

我剛剛用適當的SQL更新了答案,以便處理多行。 – 2013-02-16 06:45:13

1

由於這兩個語句是在一個SQL批處理中,觸發器將(僅設計)只觸發一次。

觸發器每行不會觸發一次 - 它們會觸發一次語句!因此,如果您有影響多個行的INSERTUPDATE語句,您的觸發器將在Inserted(可能有Deleted)僞表中擁有多行。

你寫了這個觸發的方式是真的不考慮到Inserted可能包含多行 - 你從Inserted表中選擇哪一行,如果你在一次插入20行?

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

您需要更改您的觸發器以將其考慮在內!

+0

@BogdanSahlean:每個陳述一次是正確的 - 感謝指出! – 2013-02-16 12:01:40