LOGON 트리거Logon Triggers

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse LOGON 트리거는 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 트리거는 로그인의 인증 단계가 완료되었지만 사용자 세션이 실제로 설정되기 전에 발생합니다.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 트리거는 실행되지 않습니다.Logon triggers do not fire if authentication fails.

LOGON 트리거를 사용하면 로그인 작업 추적, 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. 예를 들어 다음 코드에서 LOGON 트리거는 로그인 SQL ServerSQL Server login_test 가 이미 3개의 사용자 세션을 만든 상태에서 에 대한 로그인을 시도하면 해당 요청을 거부합니다.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. 즉, 세션이 설정되지 않도록 하려는 경우 등에서 LOGON 트리거를 사용해야 합니다.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 에서 LOGON 트리거를 실행하기 전에 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. 따라서 첫 번째 LOGON 트리거가 실행을 시작하면 트랜잭션 개수가 1개입니다.Therefore, when the first logon trigger starts firing, the transaction count is 1. 모든 LOGON 트리거가 실행을 마친 후 트랜잭션은 커밋됩니다.After all the logon triggers finish executing, the transaction commits. 다른 트리거 유형과 마찬가지로 SQL ServerSQL Server 에서는 LOGON 트리거가 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.

LOGON 트리거 내에서 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 Engine sysadmin 고정 서버 역할의 멤버를 비롯한 모든 사용자에 대해 에 성공적으로 연결하지 못하도록 효과적으로 차단할 수 있습니다.A logon trigger can effectively prevent successful connections to the 데이터베이스 엔진Database Engine for all users, including members of the sysadmin fixed server role. 로그온 트리거가 연결을 차단 중인 경우 sysadmin 고정 서버 역할의 멤버는 관리자 전용 연결을 사용하거나 최소 구성 모드(-f)로 데이터베이스 엔진Database Engine 을 시작하여 연결할 수 있습니다.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 Engine in minimal configuration mode (-f). 자세한 내용은 Database Engine Service Startup Options을(를) 참조하세요.For more information, see Database Engine Service Startup Options.

태스크Task 항목Topic
로그온 트리거를 만드는 방법에 대해 설명합니다.Describes how to create logon triggers. LOGON 트리거는 모든 데이터베이스에서 만들 수 있지만 서버 수준에서 등록되며 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

DDL 트리거DDL Triggers