Идентификатор вставленной/обновленной строки в триггере
У меня есть следующий триггер, но мне нужно найти идентификатор строки, чтобы я не обновлял все записи в таблице. Как я могу получить идентификатор затронутой строки?
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
или что-то подобное.