T-SQL UPDATE触发器帮助

时间:2010-03-12 11:08:53

标签: sql-server tsql

嗨,我想在我的数据库中创建更新触发器。 但每次触发器触发时我都会收到此错误。

错误消息:更新或删除的行值不会使行唯一,也不会改变多行(3行)

并且继承了我的触发器

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行。请指教。

2 个答案:

答案 0 :(得分:6)

嗯,你在这里的陈述:

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

似乎假设将为update语句中的每一行调用UPDATE触发器。那是的情况 - UPDATE触发器只会被调用一次,而Inserted伪表包含三行。

因此,您需要更改逻辑,以便能够处理Inserted表中的多个条目。

答案 1 :(得分:0)

你需要将它作为SET处理,它应该只是两个UPDATE语句,没有变量,没有IF s,所有必要的条件都在UPDATE join和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并加入了逻辑,那么这应该处理一次更新的[dbo]。[x1pk]的1行和/或多行。