Я бы переосмыслил весь ваш процесс. Триггеры могут быть причиной значительного снижения производительности, если они написаны неправильно. Каждый раз, когда вы думаете, что вам нужно использовать курсор или цикл, подумайте еще раз. Вы должны сделать это на основе набора.
Мы используем триггерный подход с двумя таблицами. Тот, который записывает подробности о том, когда и кто изменил таблицу, и связанную таблицу, которая содержит информацию, которая была изменена. Это помогает нам увидеть все записи, которые были изменены за один раз. Мы используем обновленный оператор для каждого поля, чтобы заполнить вторую таблицу примерно так:
if (update([test]))
begin
insert [myAudit].dbo.[mytableAuditLogDetail](AuditLogID, ID, ColumnName,
OldValue, NewValue)
select
@AuditLogID,
i.[mytableid]),
'test',
convert(varchar(8000), d.[test], 0),
convert(varchar(8000), i.[test], 0)
from inserted i
inner join deleted d on i.[mytableid]=d.[mytableid]
and (
(i.[test] <> d.[test]) or
(i.[test] is null and d.[test] Is Not Null) or
(i.[test] is not null and d.[test] Is Null)
)
end
Мы перестраиваем код триггера динамически каждый раз, когда меняется схема, но сам триггер не является динамическим. Наш триггерный процесс выполняется очень быстро, даже когда мы выполняем большой импорт.