12

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

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

UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3

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

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

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 つのトリガー アクションで更新するにはどうすればよいかということです。

ここでスタックオーバーフローで見た例は、私をやや混乱させるか、効果がないように見えます-たとえば、それらのほとんどは、私がしようとしているような束全体ではなく、2番目/他のテーブルの1つの値のみを更新するようです. 複数の値で動作するように見えるものは、理解できません:(

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

4

1 に答える 1

22

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

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仮想テーブルには複数の行を含めることができるためJOINUPDATE.

于 2013-05-18T14:12:42.587 に答える