Подтвердить что ты не робот

Являются ли Sql триггеры синхронными или асинхронными?

У меня есть таблица, на которой есть триггер insert. Если я вставляю в 6000 записей в эту таблицу в один оператор insert из хранимой процедуры, будет ли хранимая процедура возвращаться до завершения триггера вставки?

Просто, чтобы убедиться, что я правильно думаю, триггер должен быть вызван (я знаю, что 'called' не является правильным словом), потому что в нем было всего 1 оператор insert, правильно?

Мой главный вопрос: закончится ли sproc, даже если триггер не завершился?

4b9b3361

Ответ 1

Триггер вставки запускается один раз для всего оператора вставки. Вот почему важно использовать временную таблицу inserted, чтобы увидеть, что на самом деле было вставлено, а не просто выбрать самую последнюю одиночную запись или что-то в этом роде.

Я просто протестировал триггер insert и update, и, действительно, они считаются частью вставки сервером sql. процесс не завершится до тех пор, пока триггер не закончится.

Ответ 2

Триггеры являются частью транзакции, которая их вызывала.

Одна из важных вещей о триггерах, о которых вы должны знать, это то, что триггер срабатывает один раз для каждой транзакции (по крайней мере, на SQL-сервере вы должны проверять другие БД, но даже если он будет обрабатывать построчно, это обычно плохая идея) Таким образом, если вы вставите 6000 записей, триггер срабатывает один раз, а не 6000 раз. Многие люди не знают об этом и пишут триггеры так, как будто они будут обрабатывать вставки нескольких записей по одной записи за раз. Это не так, и ваш триггер должен учитывать передачу нескольких записей.

Ответ 3

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

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

Ответ 4

Дело в том, что каждый раз, когда выполняются критерии TRIGGER, срабатывает TRIGGER. Он срабатывает один раз в пакетной обработке или транзакции. См. Мой урок 101 на TRIGGER

Ответ 5

Вы должны использовать курсор в инструкции insert для обработки строки триггера. Поскольку триггеры в SQL Server срабатывают один раз за оператор, а не один раз в строке.