Сможет ли триггер скопировать первичный ключ с идентификатором? - PullRequest
3 голосов
/ 03 августа 2011

Я хочу сделать после ввода INSERT в таблицу X, чтобы немедленно скопировать эту запись в другую таблицу History.

Теперь таблица имеет первичный ключ в виде столбца Identity, поэтому запись не будет иметь идентификатор первичного ключа, пока она не будет вставлена.

Мой вопрос: если я сделаю trigger для этой записи, получу ли я идентификационный идентификатор для этой записи, или она все еще будет пустой?

Ответы [ 3 ]

5 голосов
/ 03 августа 2011

Да, идентификатор доступен в триггере, но убедитесь, что вы правильно получили этот идентификатор.

@@ identity, SCOPE_IDENTITY и т. Д. - это НЕ то, что вы хотите сделать в триггере!

SELECT @id = id FROM inserted 

Это тоже плохая идея.

Всегда пишите свои триггеры, чтобы ожидать одновременного внесения нескольких изменений. Все вышеперечисленные подходы вызовут незначительные, но важные ошибки, когда вы вставляете в таблицу более одной записи одновременно.

Правильный подход - вставить в таблицу аудита ОТ вставленной таблицы

т.е.

INSERT INTO myAuditTable(Id, Datetime, user)
SELECT id, GETDATE(), USER_NAME())
FROM inserted 
3 голосов
/ 03 августа 2011

если вы выполните триггер «после вставки», запись уже будет там со значением для столбца идентификации.

2 голосов
/ 03 августа 2011

Просто убедитесь, что вы объявили триггер как «AFTER», а не «FOR» или «INSTEAD OF» (возможно, вы не использовали бы последний ...;)

http://msdn.microsoft.com/en-us/library/ms189799.aspx

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