0

次のようなテーブルにトリガーがあります。

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 に 2 つのエントリを作成しています。

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

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

これらのクエリを一度に実行しますが、どちらのクエリでもトリガーは 1 回だけ起動し、最初のクエリのタスクのみを実行します。

両方の挿入ステートメントで機能させるにはどうすればよいですか?

4

2 に答える 2

2

単なるアイデアですが、これら 2 つの挿入ステートメントの間に GO ステートメントを配置すると、トリガーが 2 回起動する可能性があります。

おそらく、トリガーを書き直して、複数の行の挿入を処理する必要があると思います。

これが変換されたクエリです。これで 2 つの行が得られるはずです。

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

また、トリガーがはるかにシンプルになったことにも注意してください。

于 2013-02-16T06:39:43.017 に答える
1

これらの2つのステートメントは1つのSQLバッチに含まれているため、トリガー(設計上)1回だけ起動します。

トリガーは行ごとに1回起動するのではなく、ステートメントごとに1回起動します。したがって、複数の行に影響を与えるINSERTorステートメントがある場合、トリガーには(場合によっては)疑似テーブルに複数の行が含まれます。UPDATEInsertedDeleted

このトリガーを作成した方法では、複数の行が含まれる可能性があることを実際には考慮していません。一度に20行を挿入する場合Inserted、テーブルからどの行を選択しますか?Inserted

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

それを考慮に入れるには、トリガーを変更する必要があります。

于 2013-02-16T08:16:25.500 に答える