Управление выполнением триггеров при массовом импорте данных
Триггер — это особый вид хранимой процедуры, которая автоматически выполняется, когда пользователь изменяет данные в таблице или представлении. Выполнение триггеров может оказать влияние на производительность операций массового импорта. Например, триггер, отправляющий сообщение электронной почты при импорте каждой записи, снижает скорость выполнения операции массового импорта и создает большой поток сообщений электронной почты.
При массовом импорте данных выполнением (срабатыванием) триггеров можно управлять. Операция массового импорта должна вызывать срабатывание триггера только для таблиц с триггерами INSERT и INSTEAD OF, поддерживающих вставку нескольких строк. Дополнительные сведения об этих триггерах см. в разделе Триггеры DML.
Важно! |
---|
Когда триггеры отключены, для обновления метаданных может сработать блокировка модификации схемы. Это может помешать работе других команд (например оперативному построению индексов) или транзакций. Например, в транзакции в режиме изоляции моментального снимка при доступе к целевой таблице может возникнуть ошибка из-за параллельно вносимых изменений DDL. |
Если срабатывание триггеров разрешено, они выполняются один раз для всего пакета.
Т о, как именно выполняется операция массового импорта, зависит от команды, используемой для выполнения операции. По умолчанию команда bcp и инструкция BULK INSERT (Transact-SQL) отключают триггеры. Напротив, для инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) по умолчанию триггеры выполняются.
Следующая таблица содержит сводку возможных вариантов.
Команда массового импорта |
Поведение по умолчанию |
---|---|
bcp |
Триггеры отключены |
BULK INSERT |
Триггеры отключены |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
Триггеры выполняются |
Для всех команд массового импорта имеются квалификаторы, позволяющие изменять режимы выполнения триггеров, описанные в следующих разделах.
Выполнение триггеров с командой bcp или инструкцией BULK INSERT
По умолчанию команда bcp и инструкция BULK INSERT запрещают выполнение триггеров. Однако с помощью следующих квалификаторов можно разрешить его:
Команда |
Квалификатор |
Тип квалификатора |
---|---|---|
bcp |
-h"FIRE_TRIGGERS" |
Подсказка |
BULK INSERT |
FIRE_TRIGGERS |
Аргумент |
Если для операции массового импорта задан параметр FIRE_TRIGGERS, то для всех вставляемых в таблицу строк выполняются триггеры INSERT и INSTEAD OF, определенные для таблицы.
Дополнительные сведения см. в разделах Программа bcp и BULK INSERT (Transact-SQL).
Отключение триггеров в инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...)
По умолчанию поставщик массовых наборов строк OPENROWSET разрешает выполнение триггеров. Его можно отключить с помощью следующих квалификаторов:
Команда |
Квалификатор |
Тип квалификатора |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH(IGNORE_TRIGGERS) |
Табличная подсказка |
Если указана эта подсказка, то поставщиком массовых наборов строк OPENROWSET триггеры не выполняются. Дополнительные сведения о выражении IGNORE_TRIGGERS см. в разделе Табличные подсказки (Transact-SQL).
Импорт больших пакетов при включенном выполнении триггеров
SQL Server 2005 и более поздние версии используют для триггеров управление версиями строк. Версии строк сохраняются в хранилище версий базы данных tempdb. Прежде чем производить массовый импорт большого пакета записей данных с помощью триггеров, может понадобиться расширить базу данных tempdb, учитывая возросшую потребность триггеров в емкости хранилища версий. Дополнительные сведения см. в разделе Использование ресурсов при управлении версиями строк.