Триггер вставки SQL для обновления значений таблицы INSERTED

Я хочу создать триггер Insert, который обновляет значения во всех вставленных строках, если они пустые, новые значения должны быть взяты из другой таблицы в соответствии с другим столбцом во вставленной таблице.

Я пытался:

UPDATE INSERTED
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
WHERE ValueCol IS NULL

Но я получаю такую ​​ошибку:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.

Как мне это сделать?


person Shimmy Weitzhandler    schedule 03.12.2009    source источник
comment
Если вы не собираетесь инкапсулировать логику для обработки этого в хранимую процедуру, лучшей альтернативой, чем триггер, было бы использование ограничения по умолчанию: msdn.microsoft.com/en-us/library/aa175912%28SQL.80%29.aspx   -  person OMG Ponies    schedule 03.12.2009
comment
@OMG Ponies: Шимми не может использовать значение по умолчанию в соответствии с вопросом: stackoverflow.com/questions/1744455   -  person gbn    schedule 03.12.2009


Ответы (3)


Вам нужно обновить целевую таблицу, а не логическую таблицу. Однако вы присоединяетесь к логической таблице, чтобы выяснить, какие строки нужно обновить:

UPDATE YourTable
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
FROM YourTable Y
JOIN Inserted I ON Y.Key = I.Key
WHERE I.ValueCol IS NULL
person Michael Haren    schedule 03.12.2009
comment
(Я знаю, что он очень старый!) Разве при этом не будут обновлены все строки в YourTable? Добавление следующего в последнее предложение where обновит только вставленную строку: и Y.Key = I.Key. - person Andy King; 14.03.2018
comment
@AndyKing JOIN Inserted I ON Y.Key = I.Key ограничит обновление только вставленной строкой / строками - person phuzi; 14.06.2018

Вы можете изменить триггер на INSTEAD OF INSERT. Это позволит вам проверить входящие значения и, при необходимости, заменить их значениями из другой таблицы.

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT
AS 
BEGIN  

INSERT MyAwesomeTable (TheValueCol)
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol
FROM INSERTED
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1

END

ПРИМЕЧАНИЕ. Триггеры INSTEAD OF НЕ вызывают рекурсию.

person Jeff French    schedule 03.12.2009

insert into output  
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND,  
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data),   
FROM (select * from input   
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10')  
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20')  
)
  as t1   
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10 );

Отсюда и моя таблица результатов. Так что вставка не по значениям.

Мне очень жаль, но я не могу получить доступ к своей учетной записи отсюда (офис),

person Rohan    schedule 25.01.2013