web-dev-qa-db-ja.com

単一の更新SQLステートメントからの複数行の更新SQLトリガー

OK。私はSQLトリガーにまったく慣れておらず、いくつかの問題がありました。挿入トリガーは問題なく機能し、削除トリガーも正常に機能します。最初は、複数の行を削除しても1つしか削除されませんでしたが、私はそれを自分で理解することができました:)

ただし、(こことGoogleで)広範囲に検索した後でも、自分が持っているUPDATEトリガーに対する満足のいく答えを見つけることができません。私が次のような更新を行う場合

UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3

残念ながら、1つのレコードのみが更新され、もう1つのレコードはそのまま残ります。明らかに、これは良くありません。

私が使用しているトリガーは次のとおりです。

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers]

FOR UPDATE

AS
declare @customerid int;
declare @customervenue int;
declare @customeruser int;
declare @customerarea int;
declare @customerevent int;
declare @customerproject int;
declare @customerstatus int;

select @customerid=i.CustomerID from inserted i;
select @customervenue=i.CustomerVenue from inserted i;
select @customerarea=i.CustomerArea from inserted  i;
select @customerevent=i.CustomerEvent from inserted i;
select @customerproject=i.CustomerProject from inserted i;
select @customeruser=i.CustomerUser from inserted i;
select @customerstatus=i.CustomerStatus from inserted i;

Update USER_Instances Set InstanceArea = @customerarea, InstanceVenue = @customervenue, InstanceUser = @customeruser, InstanceStatus = @customerstatus, InstanceEvent = @customerevent, InstanceLastUpdate = GetDate() Where InstanceObject = 17 AND InstanceIdentity = @customerid
GO

すぐにわかるように、このトリガーは素晴らしいです-1つのレコードだけを更新したい場合。それ以外の場合は失敗します。ここでの主な質問は、更新が必要なすべてのレコードをキャッチし、それらすべてを1つのトリガーアクションで更新するにはどうすればよいですか。

Stack Overflowでここで見た例は、私を多少混乱させるか、効果がないように見えます。たとえば、それらのほとんどは、2番目/他のテーブルの1つの値のみを更新することを扱っており、私がやろうとしているような全体ではないようです。複数の値で動作するように見えるもの、私は理解できません:(

したがって、約2時間の検索の後、私はあきらめ、あなたが私を助けてくれることを願っています:)これはトリガー初心者の問題であり、MS-SQLは知っていますが、トリガーは今まで使用したことがないものです。 。だからどんな助けでも大歓迎です:)W

11
Irresistance

このようなものが必要なようです

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers]
FOR UPDATE
AS
UPDATE USER_Instances
   SET InstanceArea = i.CustomerArea, 
       InstanceVenue = i.CustomerVenue, 
       InstanceUser = i.CustomerUser, 
       InstanceStatus = i.CustomerStatus, 
       InstanceEvent = i.CustomerEvent, 
       InstanceLastUpdate = GetDate() 
  FROM USER_Instances JOIN inserted i
    ON InstanceIdentity = i.CustomerID AND InstanceObject = 17

inserted仮想テーブルには複数の行を含めることができるため、JOINを正しく実行するにはUPDATEする必要があります。

19
peterm