Триггер обновляет несколько строк с одинаковым значением

#sql #sql-server #tsql #triggers

#sql #sql-сервер #tsql #триггеры

Вопрос:

Триггер обновляет несколько строк с одинаковым значением

Здесь проблема, я пытаюсь обновить одну или несколько строк в таблице (B), но, скажем, обновляет строки с тем же значением

ТАБЛИЦА A

  ------ ----- ----- 
|ROWID |NAME |CODE |
 ------ ----- ----- 
| 123  |pepe |  1  |
| 456  |tito |  2  |
| 789  |gege |  3  |
-------------------
 

Текущий результат:

  ------ ----- ----- --------- 
|ROWID |NAME |CODE | A_ROWID |
 ------ ----- ----- --------- 
| 321  |rolo |  1  |  123    |
| 654  |kit  |  2  |  123    |
| 987  |gu   |  3  |  123    |
-----------------------------
 

Ожидаемый результат:

  ------ ----- ----- --------- 
|ROWID |NAME |CODE | A_ROWID |
 ------ ----- ----- --------- 
| 321  |rolo |  1  |  123    |
| 654  |kit  |  2  |  456    |
| 987  |gu   |  3  |  789    |
-----------------------------
 

Это триггер, я буду очень признателен за любые советы

 ALTER TRIGGER [dbo].[TRIG_AfterInsert] 
ON [dbo].[B] 
AFTER INSERT 
AS 
BEGIN
    DECLARE @Code nvarchar(100);

    SELECT @Code = CODE FROM INSERTED;

    UPDATE B 
    SET B.A_ROWID = A.ROWID 
    FROM A 
    WHERE A.CODE = @Code;
END
 

Ответ №1:

Триггер вызывается один раз для каждого оператора, что означает, что если вы обновляете одну строку, он будет вызван один раз, если вы обновляете 1 миллион строк, он будет вызван еще раз.

Итак, теперь, когда вы знаете поведение ядра триггеров, вам следует реорганизовать эти строки ниже:

 declare @Code nvarchar(100);
select @Code=CODE from INSERTED;
 

Таким образом, полный код триггера будет:

 CREATE OR ALTER TRIGGER dbo.TRIG_AfterInsert ON dbo.B AFTER INSERT AS 
BEGIN
    UPDATE B
    SET B.A_ROWID = A.ROWID 
    FROM B 
         JOIN INSERTED I ON I.ROWID = B.ROWID
         JOIN A ON A.CODE = I.CODE;
END
 

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

Предложение Where в вашем операторе преобразуется в JOIN .