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


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

Добавления: 12 декабря 2006 г.

Триггеры входа вызывают срабатывание хранимых процедур в ответ на событие 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. Дополнительные сведения см. в разделе Использование функции EVENTDATA. Для события 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.

См. также

Основные понятия

Рекомендации по выполнению триггера входа
Основные различия между триггерами DDL и триггерами DML
Проектирование и создание баз данных

Справка и поддержка

Получение помощи по SQL Server 2005