Идентификатор вставленной/обновленной строки в триггере

У меня есть следующий триггер, но мне нужно найти идентификатор строки, чтобы я не обновлял все записи в таблице. Как я могу получить идентификатор затронутой строки?

BEGIN
  UPDATE tb_Division SET  LastModified = GetDate() WHERE "id of inserted/updated row"
END

3 ответов


поскольку триггер в MS SQL Server не различает операции с одной и несколькими записями, необходимо присоединиться к таблице с вставленной псевдо-таблицей или использовать подзапрос:

UPDATE tb_Division
SET LastModified = GETDATE()
WHERE id IN (SELECT id FROM INSERTED)

id является столбцом первичного ключа вашей таблицы.


вы посмотрели на идентификатор inserted логическая таблица? Вы должны быть осторожны при использовании триггеров, так как триггер может работать на нескольких строках:

UPDATE tb_Division AS td
   SET LastModified = GetDate() 
FROM INSERTED AS i
WHERE td.id = = i.id

посмотреть здесь для более подробной информации, а с MSDN:

триггеры DML используют удаленные и вставленные логические (концептуальные) таблицы. Они структурно подобны таблице, на которой определен триггер, то есть таблице, на которой опробовано действие пользователя. Этот таблицы inserted и deleted содержат старые или новые значения строк, которые могут быть изменены действиями пользователя. Например, чтобы получить все значения в удаленной таблице, используйте:


заметь - триггер может иметь дело с тонной строк сразу - вам придется принять это во внимание!

вам нужно присоединиться к вашей таблице, чтобы обновиться с помощью Inserted псевдо-столбец в этом поле ID:

UPDATE dbo.tb_Division 
SET LastModified = GetDate() 
FROM Inserted i
WHERE tb_Division.Id = i.Id

или что-то подобное.