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