Триггеры входа
Триггеры входа вызывают срабатывание хранимых процедур в ответ на событие 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.
Отключение триггера входа
Триггер входа может эффективно предотвратить успешные соединения с компонентом Database Engine для всех пользователей, включая членов предопределенной роли сервера sysadmin. При предотвращении соединений триггером входа члены предопределенной роли сервера sysadmin могут подключиться с помощью выделенного административного соединения или путем запуска компонента Database Engine в минимальной конфигурации (-f). Дополнительные сведения см. в разделах Как применять выделенное административное соединение со средой SQL Server Management Studio и Использование параметров запуска службы SQL Server.
Захват данных событий триггера входа
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>
Содержит имя узла клиента, с которого устанавливается подключение. Если имя сервера совпадает с именем клиента, то значение по умолчанию — «<local_machine>». Иначе значение равно IP-адресу клиента.<IsPooled>
1, если соединение повторно используется с помощью пула соединений. В противном случае — значение 0.
Создание, изменение или удаление триггеров входа
Триггеры входа могут создаваться из любой базы данных, но регистрируются на уровне сервера и принадлежат базе данных master.
Создание триггера входа
Изменение триггера входа
Удаление триггера входа
Получение сведений о триггерах входа
Метаданные о триггерах входа можно запросить в представлении каталога sys.server_triggers.