Триггеры входа

Область применения: SQL Server Управляемый экземпляр SQL Azure

Триггеры входа запускают хранимые процедуры в ответ на событие LOGON. Это событие возникает при установке сеанса пользователя с экземпляром SQL Server. Триггеры входа в систему срабатывают после завершения этапа аутентификации при входе в систему, но до установления пользовательского сеанса. Поэтому все сообщения, поступающие внутри триггера, которые обычно будут обращаться к пользователю, например сообщения об ошибках и сообщениях из PRINT инструкции, перенаправляются в журнал ошибок SQL Server. Если проверка подлинности завершается сбоем, триггеры входа не срабатывают.

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

USE master;
GO

CREATE LOGIN login_test
WITH PASSWORD = N'3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO

GRANT VIEW SERVER STATE TO login_test;
GO

CREATE TRIGGER connection_limit_trigger ON ALL SERVER
WITH EXECUTE AS N'login_test'
FOR LOGON AS BEGIN
    IF ORIGINAL_LOGIN() = N'login_test'
    AND (
        SELECT COUNT(*)
        FROM sys.dm_exec_sessions
        WHERE is_user_process = 1
            AND original_login_name = N'login_test') > 3
    ROLLBACK;
END;

Событие LOGON соответствует событию AUDIT_LOGIN трассировки SQL, которое может использоваться в уведомлениях о событиях. Основное отличие между триггерами и уведомлениями о событиях состоит в том, что триггеры вызываются синхронно с событиями, тогда как уведомления о событиях асинхронны. Это означает, например, что если необходимо остановить установление сеанса, необходимо использовать триггер входа. Уведомление о событии AUDIT_LOGIN не может использоваться для этой цели.

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

Для события LOGON можно определить несколько триггеров. Любой из этих триггеров может быть назначен как первый или последний триггер, активируемый при возникновении некоторого события с использованием системной хранимой процедуры sp_settriggerorder . SQL Server не гарантирует порядок выполнения оставшихся триггеров.

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

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

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

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

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

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

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

Отключение триггера входа

Триггер входа может фактически блокировать успешное подключение к компоненту ядро СУБД для всех пользователей, включая членов фиксированной серверной роли sysadmin. Если триггер входа запрещает подключения, члены предопределенной роли сервера sysadmin могут подключаться с помощью выделенного подключения администратора или запуска ядро СУБД в минимальном режиме конфигурации (-f). Дополнительные сведения см. в разделе Параметры запуска службы ядра СУБД.