2008-10-16 5 views
23

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

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

Мой главный вопрос: будет ли пряжка SPRO даже если триггер не завершил?

ответ

19

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

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

+1

Спасибо, что упомянул об этом. Я забыл об этом и сделал точно то, что я не должен был делать в подобной ситуации с триггером, который я собираюсь развернуть. Я просто переписал его, чтобы обработать весь набор вставки из вставленного вместо самого последнего id. Ик! Возможно, это была ошибка helluva. ;) – 2008-10-16 20:26:06

+0

Эй, рад, что я мог бы помочь! – 2008-10-16 20:28:05

1

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

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

6

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

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

+1

Это зависит от определения триггера. В Oracle, например, мы можем потребовать запуск триггера для каждой строки с предложением FOR EACH ROW. http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#431 – 2013-01-23 14:21:33

1

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

-1

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