Sql-триггеры синхронны или асинхронны?

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
27
0
13 396
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

Спасибо, что упомянули об этом. Я забыл об этом и сделал именно то, что мне не следовало делать в подобной ситуации, с триггером, который я собираюсь развернуть. Я просто переписал его, чтобы обрабатывать весь набор вставок из вставленного вместо самого последнего идентификатора. Ура! Могло быть чертовски ошибкой. ;)

Troy Howard 17.10.2008 00:26

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

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

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

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

Это зависит от определения триггера. В Oracle, например, мы можем требовать выполнения триггера для каждой строки с предложением FOR EACH ROW. docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#‌ 431

Marcin Rybacki 23.01.2013 18:21

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

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

Нет никаких обстоятельств, при которых вы должны использовать курсор в триггере сервера sql. Вам нужно написать курсоры, чтобы сохранить целостность данных и работать как можно быстрее. В то время как курсор может делать первое, в конце он терпит неудачу. Вы должны использовать обработку на основе наборов. Я не хочу блокировать свою таблицу на часы, пока она обрабатывает с помощью курсора что-то, что может занять секунды или миллисекунды. Мы удалили одну, у которой время обработки 40 000 записей сократилось с 45 минут до 40 секунд. Использование курсора в триггере безответственно.

HLGEM 16.09.2014 18:49

Другие вопросы по теме