Я знаю, что в триггере - по крайней мере для SQL Server - никогда не следует предполагать, что таблица inserted
имеет только одну строку, что означает, что SQL в триггере, как этот, обычно плох:
select @UserID = ID from inserted
Но из любопытства, может ли набор операторов INSERT когда-либо привести к таблице inserted
из более чем одной строки? Я знаю, что это достаточно просто с ОБНОВЛЕНИЕМ, но из моих тестов я не могу смоделировать аналогичный результат для вставки. Я пытался отправить через наборы вставок перед отправкой пакетного терминатора, например:
insert into TriggerTest (col2) select 'a'
insert into TriggerTest (col2) select 'b'
insert into TriggerTest (col2) select 'c'
go
А также оборачивая их в транзакции:
begin tran
insert into TriggerTest (col2) select 'a'
insert into TriggerTest (col2) select 'b'
insert into TriggerTest (col2) select 'c'
commit
Но это всегда приводит к тому, что триггер срабатывает 3 раза с таблицей inserted
из 1 строки и никогда один раз с таблицей inserted
из 3 строк.
Это совершенно логично для меня (в конце концов, это 3 отдельных утверждения), и мне на самом деле не нужно это делать, мне просто интересно, могут ли одни ВСТАВКИ вести себя иначе, чем это.
Редактировать: это глупый вопрос: конечно, может, при вставке набора результатов!
insert into TriggerTest (col2) select 'a' union select 'b'
... или любой другой набор.
Простите, здесь почти 3 часа ночи. Я оставлю этот вопрос здесь для людей, которые все равно должны знать лучше.