Управление выполнением триггеров при массовом импорте данных

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

При массовом импорте данных выполнением (срабатыванием) триггеров можно управлять. Операция массового импорта должна вызывать срабатывание триггера только для таблиц с триггерами 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, учитывая возросшую потребность триггеров в емкости хранилища версий. Дополнительные сведения см. в разделе Использование ресурсов при управлении версиями строк.