Идентификатор вставленной / обновленной строки в триггере - PullRequest
11 голосов
/ 06 июля 2010

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

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

Ответы [ 3 ]

16 голосов
/ 06 июля 2010

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

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

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

4 голосов
/ 06 июля 2010

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

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

См. здесь для получения дополнительной информации и от MSDN :

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

0 голосов
/ 06 июля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...