У меня есть таблица с триггером вставки. Если я вставлю 6000 записей в эту таблицу в одном операторе вставки из хранимой процедуры, вернется ли хранимая процедура до завершения триггера вставки?
Просто чтобы убедиться, что я правильно думаю, триггер должен вызываться только один раз (я знаю, что «вызывается» - неправильное слово), потому что был только один оператор вставки, верно?
Мой главный вопрос: закончится ли sproc, даже если триггер не сработал?


Ваш триггер вставки будет запускаться один раз для всего оператора вставки. Вот почему важно использовать временную таблицу inserted, чтобы увидеть, что на самом деле было вставлено, а не просто выбрать самую последнюю отдельную запись или что-то в этом роде.
Я только что протестировал триггер вставки и обновления, и действительно, они считаются частью вставки сервером sql. процесс не завершится, пока не сработает триггер.
Вызов триггера не является асинхронным. Каждый вызов вашей процедуры вставки приведет к срабатыванию триггера, и процедура не вернется, пока триггер не завершится.
Взгляните на план запроса, чтобы увидеть, как он работает. Вы увидите, что операторы в триггере будут вызываться при каждом вызове процедуры.
Триггеры являются частью транзакции, которая их вызвала.
Одна важная вещь о триггерах, о которой вы должны знать, заключается в том, что триггер срабатывает один раз для каждой транзакции (по крайней мере, на SQL-сервере вы должны проверять другие базы данных, но даже если он будет обрабатывать строку за строкой, это обычно плохая идея) , поэтому, если вы вставите 6000 записей, триггер сработает один раз, а не 6000 раз. Многие люди не знают об этом и пишут триггеры так, как будто они будут обрабатывать несколько записей, вставляя по одной записи за раз. Это неверно, и ваш триггер должен учитывать обработку вставки нескольких записей.
Это зависит от определения триггера. В Oracle, например, мы можем требовать выполнения триггера для каждой строки с предложением FOR EACH ROW. docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm# 431
Дело в том, что каждый раз, когда выполняется условие TRIGGER, запускается TRIGGER. Он запускается один раз при пакетной обработке или транзакции. Смотрите мой Урок 101 на TRIGGER
Вы должны использовать курсор в операторе вставки для обработки строки триггера. Потому что триггеры в SQL Server срабатывают один раз для каждого оператора, а не один раз для каждой строки.
Нет никаких обстоятельств, при которых вы должны использовать курсор в триггере сервера sql. Вам нужно написать курсоры, чтобы сохранить целостность данных и работать как можно быстрее. В то время как курсор может делать первое, в конце он терпит неудачу. Вы должны использовать обработку на основе наборов. Я не хочу блокировать свою таблицу на часы, пока она обрабатывает с помощью курсора что-то, что может занять секунды или миллисекунды. Мы удалили одну, у которой время обработки 40 000 записей сократилось с 45 минут до 40 секунд. Использование курсора в триггере безответственно.
Спасибо, что упомянули об этом. Я забыл об этом и сделал именно то, что мне не следовало делать в подобной ситуации, с триггером, который я собираюсь развернуть. Я просто переписал его, чтобы обрабатывать весь набор вставок из вставленного вместо самого последнего идентификатора. Ура! Могло быть чертовски ошибкой. ;)