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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure (только управляемый экземпляр) нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Триггеры входа вызывают срабатывание хранимых процедур в ответ на событие LOGON.Logon triggers fire stored procedures in response to a LOGON event. Это событие вызывается при установке пользовательского сеанса с экземпляром SQL ServerSQL Server.This event is raised when a user session is established with an instance of SQL ServerSQL Server. Триггеры входа срабатывают после завершения этапа проверки подлинности при входе, но перед тем, как пользовательский сеанс реально устанавливается.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is actually established. Следовательно, все сообщения, которые возникают внутри триггера и обычно достигают пользователя, такие как сообщения об ошибках и сообщения от инструкции PRINT, перенаправляются в журнал ошибок SQL ServerSQL Server .Therefore, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Если проверка подлинности завершается сбоем, триггеры входа не срабатывают.Logon triggers do not fire if authentication fails.

Можно использовать триггеры входа для проверки и управления сеансами сервера, например для отслеживания входов в систему, ограничения входов в SQL ServerSQL Serverили ограничения числа сеансов для конкретного имени входа.You can use logon triggers to audit and control server sessions, such as by tracking login activity, restricting logins to SQL ServerSQL Server, or limiting the number of sessions for a specific login. Например, в следующем коде триггер входа запрещает попытки входа на SQL ServerSQL Server , инициированные под именем входа login_test , если уже созданы три пользовательских сеанса под этим именем входа.For example, in the following code, the logon trigger denies log in attempts to SQL ServerSQL Server initiated by login login_test if there are already three user sessions created by that login.

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, которое можно использовать в уведомлениях о событии.Note that the LOGON event corresponds to the AUDIT_LOGIN SQL Trace event, which can be used in Event Notifications. Основное отличие между триггерами и уведомлениями о событиях состоит в том, что триггеры вызываются синхронно с событиями, тогда как уведомления о событиях асинхронны.The primary difference between triggers and event notifications is that triggers are raised synchronously with events, whereas event notifications are asynchronous. Это означает, например, что если необходимо остановить установление сеанса, необходимо использовать триггер входа.This means, for example, that if you want to stop a session from being established, you must use a logon trigger. Для этой цели нельзя использовать уведомление о событии AUDIT_LOGIN.An event notification on an AUDIT_LOGIN event cannot be used for this purpose.

Указание первого и последнего триггераSpecifying First and Last Trigger

В событии LOGON может быть определено несколько триггеров.Multiple triggers can be defined on the LOGON event. Любой из этих триггеров может быть назначен как первый или последний триггер, активируемый при возникновении некоторого события с использованием системной хранимой процедуры sp_settriggerorder .Any one of these triggers can be designated the first or last trigger to be fired on an event by using the sp_settriggerorder system stored procedure. SQL ServerSQL Server не гарантирует порядок выполнения остальных триггеров.does not guarantee the execution order of the remaining triggers.

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

Перед тем как SQL ServerSQL Server активирует триггер входа, SQL ServerSQL Server создает неявную транзакцию, которая не зависит ни от какой пользовательской транзакции.Before SQL ServerSQL Server fires a logon trigger, SQL ServerSQL Server creates an implicit transaction that is independent from any user transaction. Таким образом, при срабатывании первого триггера входа счетчик транзакций имеет значение 1.Therefore, when the first logon trigger starts firing, the transaction count is 1. После завершения выполнения всех триггеров входа происходит фиксация транзакции.After all the logon triggers finish executing, the transaction commits. Как и для триггеров других типов, SQL ServerSQL Server возвращает ошибку, если триггер входа завершает выполнение со значением счетчика транзакций, равным 0.As with other types of triggers, SQL ServerSQL Server returns an error if a logon trigger finishes execution with a transaction count of 0. Инструкция ROLLBACK TRANSACTION сбрасывает счетчик транзакций в 0, даже если инструкция выдана внутри вложенной транзакции.The ROLLBACK TRANSACTION statement resets the transaction count to 0, even if the statement is issued inside a nested transaction. Инструкция COMMIT TRANSACTION может уменьшить значение счетчика транзакций до 0.COMMIT TRANSACTION might decrement the transaction count to 0. В связи с этим не рекомендуется использовать инструкции COMMIT TRANSACTION внутри триггеров входа.Therefore, we advise against issuing COMMIT TRANSACTION statements inside logon triggers.

Учитывайте следующее при использовании инструкции ROLLBACK TRANSACTION в триггерах входа.Consider the following when you are using a ROLLBACK TRANSACTION statement inside logon triggers:

  • Происходит откат любых изменений данных, сделанных до точки отката ROLLBACK TRANSACTION.Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back. В эти изменения входят как изменения, сделанные текущим триггером, так и те изменения, которые были сделаны предыдущими триггерами, выполнявшимися в том же событии.These modifications include those made by the current trigger and those made by previous triggers that executed on the same event. Оставшиеся триггеры указанного события выполняться не будут.Any remaining triggers for the specific event are not executed.

  • Текущий триггер продолжает выполнять все оставшиеся инструкции после инструкции ROLLBACK.The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. Если какая-нибудь из инструкций изменит данные, откат этих изменений выполнен не будет.If any of these statements modify data, the modifications are not rolled back.

Сеанс пользователя не будет установлен, если произойдет одно из следующих событий при выполнении триггера на событии LOGON.A user session is not established if any one of the following conditions occur during execution of a trigger on a LOGON event:

  • Произойдет либо откат, либо сбой исходной неявной транзакции.The original implicit transaction is rolled back or fails.

  • В тексте триггера появится ошибка с уровнем серьезности свыше 20.An error that has severity greater than 20 is raised inside the trigger body.

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

Триггер входа может эффективно запрещать подключения к службам Компонент Database EngineDatabase Engine для всех пользователей, в том числе членов предопределенной роли сервера sysadmin .A logon trigger can effectively prevent successful connections to the Компонент Database EngineDatabase Engine for all users, including members of the sysadmin fixed server role. Если триггер входа запрещает соединения, члены предопределенной роли сервера sysadmin могут подключаться с помощью выделенного административного соединения или путем вызова Компонент Database EngineDatabase Engine в режиме минимальной конфигурации (-f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Компонент Database EngineDatabase Engine in minimal configuration mode (-f). Дополнительные сведения см. в разделе Параметры запуска службы Database Engine.For more information, see Database Engine Service Startup Options.

ЗадачаTask РазделTopic
Описывает, как создать триггеры входа.Describes how to create logon triggers. Триггеры входа могут создаваться из любой базы данных, но регистрируются на уровне сервера и принадлежат базе данных master .Logon triggers can be created from any database, but are registered at the server level and reside in the master database. CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)
Описывает, как изменить триггеры входа.Describes how to modify logon triggers. ALTER TRIGGER (Transact-SQL)ALTER TRIGGER (Transact-SQL)
Описывает, как удалить триггеры входа.Describes how to delete logon triggers. DROP TRIGGER (Transact-SQL)DROP TRIGGER (Transact-SQL)
Описывает, как возвратить сведения о триггерах входа.Describes how to return information about logon triggers. sys.server_triggers (Transact-SQL)sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)sys.server_trigger_events (Transact-SQL)
Описывает, как перехватить данные события триггером входа.Describes how to capture logon trigger event data.

См. также:See Also

Триггеры DDLDDL Triggers