Являются ли Sql триггеры синхронными или асинхронными?
У меня есть таблица, на которой есть триггер insert. Если я вставляю в 6000 записей в эту таблицу в один оператор insert из хранимой процедуры, будет ли хранимая процедура возвращаться до завершения триггера вставки?
Просто, чтобы убедиться, что я правильно думаю, триггер должен быть вызван (я знаю, что 'called' не является правильным словом), потому что в нем было всего 1 оператор insert, правильно?
Мой главный вопрос: закончится ли sproc, даже если триггер не завершился?
Ответы
Ответ 1
Триггер вставки запускается один раз для всего оператора вставки. Вот почему важно использовать временную таблицу inserted
, чтобы увидеть, что на самом деле было вставлено, а не просто выбрать самую последнюю одиночную запись или что-то в этом роде.
Я просто протестировал триггер insert и update, и, действительно, они считаются частью вставки сервером sql. процесс не завершится до тех пор, пока триггер не закончится.
Ответ 2
Триггеры являются частью транзакции, которая их вызывала.
Одна из важных вещей о триггерах, о которых вы должны знать, это то, что триггер срабатывает один раз для каждой транзакции (по крайней мере, на SQL-сервере вы должны проверять другие БД, но даже если он будет обрабатывать построчно, это обычно плохая идея) Таким образом, если вы вставите 6000 записей, триггер срабатывает один раз, а не 6000 раз. Многие люди не знают об этом и пишут триггеры так, как будто они будут обрабатывать вставки нескольких записей по одной записи за раз. Это не так, и ваш триггер должен учитывать передачу нескольких записей.
Ответ 3
Триггерный вызов не является асинхронным. Каждый вызов вашей процедуры вставки приведет к срабатыванию триггера, и процедура не вернется, пока не закончится триггер.
Взгляните на план запроса, чтобы увидеть, как он работает. Вы увидите, что инструкции в триггере будут вызываться для каждого вызова процедуры.
Ответ 4
Дело в том, что каждый раз, когда выполняются критерии TRIGGER, срабатывает TRIGGER. Он срабатывает один раз в пакетной обработке или транзакции. См. Мой урок 101 на TRIGGER
Ответ 5
Вы должны использовать курсор в инструкции insert для обработки строки триггера.
Поскольку триггеры в SQL Server срабатывают один раз за оператор, а не один раз в строке.