2010-03-12 67 views
1

嗨iam試圖在我的數據庫中作出更新觸發器。 但每次觸發觸發時我都會收到此錯誤。T-SQL更新觸發器幫助

錯誤消息:該行的值(一個或多個)更新或刪除或者不要使行唯一或他們更改多個行(3rows)

和我的繼承人觸發

ALTER TRIGGER [dbo].[x1pk_qp_update] 
     ON [dbo].[x1pk] FOR UPDATE 
AS 
BEGIN TRY 
DECLARE @UserId int 
     , @PackareKod int 
     , @PersSign varchar(10) 

    SELECT @PackareKod = q_packarekod 
     , @PersSign = q_perssign 
     FROM INSERTED 

IF @PersSign IS NOT NULL 
BEGIN 
    IF EXISTS (SELECT * FROM [QPMardskog].[dbo].[UserAccount] WHERE [Account] = @PackareKod) 
    BEGIN 
    SET @UserId = (SELECT [UserId] 
        FROM [QPMardskog].[dbo].[UserAccount] 
        WHERE [Account] = @PackareKod) 

     UPDATE [QPMardskog].[dbo].[UserAccount] 
      SET [Active] = 1 
     WHERE [Account] = @PackareKod 

     UPDATE [QPMardskog].[dbo].[User] 
      SET [Active] = 1 
     WHERE [Id] = @UserId 


    END 
END 

END TRY 

但我只更新表中的一行,它如何說3行。請指教。

+0

它可以更新超過1條記錄。您從最後這些記錄中選擇@PackareKod和@PersSign。 – garik 2010-03-12 11:22:32

回答

6

好了,你在這裏的講話:

SELECT @PackareKod = q_packarekod, @PersSign = q_perssign 
FROM INSERTED 

似乎假定你的UPDATE觸發器將被要求在一個更新語句的每一行。即不是的情況 - UPDATE觸發器將只被調用一次,而Inserted僞表包含三行。

所以你需要改變你的邏輯,以便能夠處理Inserted表中的多個條目。

0

你需要處理此爲一組,應該是隻有兩個UPDATE語句,沒有變量,沒有IF S,所有必要條件都在UPDATE加入和WHERE邏輯:

ALTER TRIGGER [dbo].[x1pk_qp_update] 
     ON [dbo].[x1pk] FOR UPDATE 
AS 
BEGIN TRY 

    UPDATE u 
     SET [Active] = 1 
     FROM [QPMardskog].[dbo].[UserAccount] u 
     INNER JOIN INSERTED     i ON u.[Account]=i.q_packarekod 
     WHERE i.q_perssign IS NOT NULL 

    UPDATE u 
     SET [Active] = 1 
     FROM [QPMardskog].[dbo].[User] u 
     WHERE [Id] IN (SELECT [UserId] 
          FROM [QPMardskog].[dbo].[UserAccount] 
          WHERE [Account] IN (SELECT q_packarekod 
                FROM INSERTED 
                WHERE q_perssign IS NOT NULL 
              ) 
        ) 

END TRY 

如果我翻譯IF和正確加入邏輯,這應該處理1次和/或多行[dbo]。[x1pk],它們一次被更新。

+0

不能工作我得到相同的錯誤消息:錯誤消息:更新或刪除行值不要使行唯一或他們改變多行(3行)。我不明白爲什麼我得到這個錯誤信息。我只更新了x1pk表中的一行。爲什麼說3行。再有建議。感謝你的努力。 – Tan 2010-03-15 07:04:12