2010-03-12 135 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