Да, в SQL Server триггеры запускаются один раз за оператор, а не один раз за строку.
Вы не показали нам достаточно своего SQL, чтобы я мог предложить, как переписать ваш триггер. Если это что-то вроде:
UPDATE Table2 set ABC = DEF where ID = (select StudentID from Inserted)
тогда переписать так же просто, как:
UPDATE Table2 set ABC = DEF where ID in (select StudentID from Inserted)
Более сложные запросы потребуют больше работы для их исправления.
Из вашего примера (в настоящее время опубликован как ответ) у вас есть:
if (select studentID from Inserted) <> (select studentId from deleted)
Вместо этого вы можете получить что-то вроде:
if exists(select * from inserted i full outer join deleted d on i.StudentID = d.StudentID where i.StudentID is null or d.StudentID is null)
Который проверяет, что вы можете объединить каждую строку во вставленной строке с удаленной, и наоборот.
Однако, если это ранняя часть вашего триггера, вероятно, есть другие места в коде, которые предполагают только одну строку в inserted
и deleted
. Все они должны будут измениться.
Чтобы еще раз подчеркнуть мое первое предложение - SQL Server вызывает срабатывание один раз за оператор, а не один раз за строку. Нет способа изменить это, поэтому вы должны изменить свой код, чтобы справиться с этим.