Рекомендации по выполнению триггера входа

В этом разделе содержатся рекомендации по указанию порядка запуска триггеров входа и управлению транзакциями внутри триггеров входа.

Указание первого и последнего триггера

В событии LOGON может быть определено несколько триггеров. Для любого из этих триггеров можно указать, будет ли он срабатывать первым или последним, при помощи системной хранимой процедуры sp_settriggerorder. SQL Server не определяет порядок выполнения остальных триггеров. Дополнительные сведения см. в разделе Проектирование и реализация структурированного хранилища (компонент Database Engine).

Управление транзакциями

Перед срабатыванием триггера входа, SQL Server создает неявную транзакцию, которая независима от любой пользовательской транзакции. Таким образом, при срабатывании первого триггера входа счетчик транзакций имеет значение 1. После завершения выполнения всех триггеров входа происходит фиксация транзакции. Как и для триггеров других типов, SQL Server возвращает ошибку, если триггер входа завершает выполнение со значением счетчика транзакций, равным 0. Инструкция ROLLBACK TRANSACTION сбрасывает счетчик транзакций в значение 0, даже если эта инструкция инициируется внутри вложенной транзакции. Инструкция COMMIT TRANSACTION может снизить значение счетчика транзакций до 0, поэтому рекомендуется не выполнять инструкции COMMIT TRANSACTION внутри триггеров входа.

Учитывайте следующее при использовании инструкции ROLLBACK TRANSACTION в триггерах входа.

  • Происходит откат любых изменений данных, сделанных до точки отката ROLLBACK TRANSACTION. В эти изменения входят как изменения, сделанные текущим триггером, так и те изменения, которые были сделаны предыдущими триггерами, выполнявшимися в том же событии. Оставшиеся триггеры указанного события выполняться не будут.

  • Текущий триггер продолжает выполнять все оставшиеся инструкции после инструкции ROLLBACK. Если какая-нибудь из инструкций изменит данные, откат этих изменений выполнен не будет.

Сеанс пользователя не будет установлен, если произойдет одно из следующих событий при выполнении триггера на событии LOGON.

  • Произойдет либо откат, либо сбой исходной неявной транзакции.

  • В теле триггера появится ошибка с уровнем серьезности, большим 20.