Поделиться через


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

Область применения: 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). Дополнительные сведения см. в разделе ядро СУБД Параметры запуска службы.