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

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

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

Ответ 1

Поскольку триггер в MS SQL Server не различает операции с одиночной записью и несколькими записями, вы должны ПРИСОЕДИНИТЬСЯ к таблице с псевдо-таблицей INSERTED или использовать подзапрос:

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

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

Ответ 2

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

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

Подробнее см. здесь и MSDN:

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

Ответ 3

Учтите, что триггер может обрабатывать тонну строк сразу - вам придется принять это во внимание!

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

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

или что-то в этом роде.