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


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

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

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

USE master;
GO

CREATE LOGIN login_test WITH PASSWORD = '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 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
    (SELECT COUNT(*) FROM sys.dm_exec_sessions
            WHERE is_user_process = 1 AND
                original_login_name = 'login_test') > 3
    ROLLBACK;
END;

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

Захват данных событий триггера входа

XML-данные о событиях LOGON для использования внутри триггеров входа могут быть захвачены с использованием функции EVENTDATA. Дополнительные сведения см. в разделе Проектирование и реализация структурированного хранилища (компонент Database Engine). Для события LOGON возвращается следующая схема данных событий:

<EVENT_INSTANCE>

<EventType>event_type</EventType>

<PostTime>post_time</PostTime>

<SPID>spid</SPID>

<ServerName>server_name</ServerName>

<LoginName>login_name</LoginName>

<LoginType>login_type</LoginType>

<SID>sid</SID>

<ClientHost>client_host</ClientHost>

<IsPooled>is_pooled</IsPooled>

</EVENT_INSTANCE>

  • <EventType>
    Содержит LOGON.

  • <PostTime>
    Содержит время запроса на установление сеанса.

  • <SID>
    Содержит закодированный в base 64-битовый бинарный поток идентификационного номера безопасности (SID) для указанного имени входа.

  • <ClientHost>
    Содержит имя узла клиента, с которого устанавливается подключение. Если имя сервера совпадает с именем клиента, то значение по умолчанию — «&lt;local_machine&gt;». Иначе значение равно IP-адресу клиента.

  • <IsPooled>
    1, если соединение повторно используется с помощью пула соединений. В противном случае — значение 0.

Создание, изменение или удаление триггеров входа

Триггеры входа могут создаваться из любой базы данных, но регистрируются на уровне сервера и принадлежат базе данных master.

Создание триггера входа

Изменение триггера входа

Удаление триггера входа

Получение сведений о триггерах входа

Метаданные о триггерах входа можно запросить в представлении каталога sys.server_triggers.