Справка по триггеру T-SQL UPDATE - PullRequest
1 голос
/ 12 марта 2010

Привет, я пытаюсь сделать триггер обновления в моей базе данных. Но я получаю эту ошибку каждый раз, когда срабатывает триггер.

Сообщение об ошибке: Обновленные или удаленные значения строки либо не делают строку уникальной, либо изменяют несколько строк (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 ]

6 голосов
/ 12 марта 2010

Ну, ваше утверждение здесь:

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

похоже предполагает, что ваш триггер UPDATE будет вызываться для каждой строки в операторе обновления. Это не случай - триггер UPDATE будет вызываться только один раз , а псевдотаблица Inserted содержит три строки.

Так что вам нужно изменить свою логику, чтобы иметь возможность работать с несколькими записями в таблице Inserted.

0 голосов
/ 12 марта 2010

вам нужно обработать это как SET, это должны быть просто два оператора 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], которые обновляются за один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...