Триггеры Sql являются синхронными или асинхронными? - PullRequest
26 голосов
/ 17 октября 2008

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

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

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

Ответы [ 5 ]

24 голосов
/ 17 октября 2008

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

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

7 голосов
/ 17 октября 2008

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

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

2 голосов
/ 17 октября 2008

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

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

1 голос
/ 17 октября 2008

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

0 голосов
/ 09 апреля 2013

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

...