2012-02-29 9 views
0

私は1行だけを更新してもうまく動作する更新トリガを書いていますが、複数の行を更新するとエラーが発生します。複数行更新のトリガを書き込む方法は?

エラー:ここ

Msg 512, Level 16, State 1, Procedure Sale_OnUpdate, Line 14 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

は私が複数の行のために働いて、それを作るために何をすべき変化をトリガー

ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
    AFTER Update 

AS 
Declare @ID as decimal 
Declare @User as varchar(250) 
Declare @Status as varchar(250) 

set @ID = (Select ID from Inserted) 
set @User = (Select UpdatedByUser from Inserted) 
set @Status = Isnull((Select Status from Inserted),'') 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    INSERT INTO [dbo].[Log] 
      (
      [RecordID] 
      ,[Date] 
      ,[Time] 
      ,[UserName] 
      ,[TableName] 
      ,[Action] 
      ) 
    VALUES 
      (
      @ID 
      ,GetDate() 
      ,GetDate() 
      ,@User 
      ,'Sale' 
      ,'Update,' + @Status 
      ) 
END 

です。

答えて

0

用途:

ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
    AFTER Update 

AS 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
    SET NOCOUNT ON; 

    INSERT INTO [dbo].[Log] 
    ([RecordID] 
    , [Date] 
    , [Time] 
    , [UserName] 
    , [TableName] 
    , [Action]) 
    SELECT i.id, 
     GETDATE(), 
     GETDATE(), 
     i.updatedbyuser, 
     'Sale', 
     'Update,' + ISNULL(i.status, '') 
    FROM INSERTED i 

END 
+0

しかし、これら3つのフィールド(ID、User、Status)をログに記録します。 –

+0

@MujassirNasir:あなたの質問ではありませんでした。 –

+0

私はこれを試しましたが、私はそれが動作する知っているが、私はすべてのアクションを記録するトリガを書きたい。 –

1
ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
    AFTER Update 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    INSERT INTO [dbo].[Log] 
      (
      [RecordID] 
      ,[Date] 
      ,[Time] 
      ,[UserName] 
      ,[TableName] 
      ,[Action] 
      ) 
    SELECT 
      ID 
      ,GetDate() 
      ,GetDate() 
      ,UpdatedByUser 
      ,'Sale' 
      ,'Update,' + Isnull(Status,'') 
    from Inserted 
END 
+0

しかし、これらの3つのフィールド(ID、User、Status)をログに記録します。 –

+0

@MujassirNasirこれは、改訂されたトリガーがまさにそうであることです(元の質問で指定されているように、ユーザーの代わりにUpdatedByUserが使用されることを除いて)。 SELECT節を慎重に調べます。 –

1

私は同様の問題があった。この

ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
    AFTER Update 

AS 
as 
if update (qty) 


BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
    SET NOCOUNT ON; 
/* check value of @@rowcount */ 
    if @@rowcount = 1 

    INSERT INTO [dbo].[Log] 
    ([RecordID] 
    , [Date] 
    , [Time] 
    , [UserName] 
    , [TableName] 
    , [Action]) 
    SELECT id, 
     GETDATE(), 
     GETDATE(), 
     updatedbyuser, 
     'Sale', 
     'Update,' + ISNULL(status, '') 

    else 
    /* when rowcount is greater than 1, 
     use a group by clause */ 
    begin 
    INSERT INTO [dbo].[Log] 
    ([RecordID] 
    , [Date] 
    , [Time] 
    , [UserName] 
    , [TableName] 
    , [Action]) 
    SELECT i.id, 
     GETDATE(), 
     GETDATE(), 
     i.updatedbyuser, 
     'Sale', 
     'Update,' + ISNULL(i.status, '') 
    FROM INSERTED i 
    and inserted.title_id = deleted.title_id 
    end 

END 
0

を試してみてください、ここでの考え方は、挿入されたテーブルは、多くのレコードを持っているということですので、あなたは、それぞれの値を分析したい場合は、たとえば、カーソルを使用してテーブルを反復する必要があります。

Loop through INSERTED table