#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
.