LOGON 트리거

적용 대상:SQL ServerAzure SQL Managed Instance

로그온은 LOGON 이벤트에 대한 응답으로 실행 저장 프로시저를 트리거합니다. 이 이벤트는 사용자 세션이 SQL Server 인스턴스와 함께 설정될 때 발생합니다. LOGON 트리거는 로그인의 인증 단계가 완료되었지만 사용자 세션이 실제로 설정되기 전에 발생합니다. 따라서 일반적으로 사용자에게 도달하는 트리거 내에서 발생하는 모든 메시지(예: PRINT 문의 오류 메시지 및 메시지)는 SQL Server 오류 로그로 전환됩니다. 인증에 실패할 경우 LOGON 트리거는 실행되지 않습니다.

로그온 트리거를 사용하여 로그인 활동을 추적하거나, SQL Server로 로그인을 제한하거나, 특정 로그인에 대한 세션 수를 제한하는 등 서버 세션을 감사하고 제어할 수 있습니다. 예를 들어 다음 코드에서 로그온 트리거는 해당 로그인 에서 만든 사용자 세션이 이미 3개인 경우 로그인 login_test 시작된 SQL Server에 대한 로그인 시도를 거부합니다.

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

LOGON 이벤트는 이벤트 알림에서 사용할 수 있는 AUDIT_LOGIN SQL 추적 이벤트에 해당합니다. 트리거와 이벤트 알림의 주요 차이점은 이벤트 알림이 비동기인 반면 트리거는 이벤트와 동기적으로 발생한다는 것입니다. 예를 들어 세션이 설정되지 않도록 하려면 로그온 트리거를 사용해야 합니다. 이런 경우에는 AUDIT_LOGIN 이벤트의 이벤트 알림을 사용할 수 없습니다.

첫 번째 및 마지막 트리거 지정

LOGON 이벤트에 여러 트리거를 정의할 수 있습니다. 이러한 트리거 중 하나는 sp_settriggerorder 시스템 저장 프로시저를 사용하여 이벤트에서 발생할 첫 번째 또는 마지막 트리거를 지정할 수 있습니다. SQL Server는 나머지 트리거의 실행 순서를 보장하지 않습니다.

트랜잭션 관리

SQL Server가 로그온 트리거를 실행하기 전에 SQL Server는 사용자 트랜잭션과 독립적인 암시적 트랜잭션을 만듭니다. 따라서 첫 번째 로그온 트리거가 실행하기 시작하면 트랜잭션 수는 1입니다. 모든 로그온 트리거 실행이 완료되면 트랜잭션이 커밋됩니다. 다른 유형의 트리거와 마찬가지로 로그온 트리거가 트랜잭션 수가 0인 실행을 완료하면 SQL Server에서 오류를 반환합니다. ROLLBACK TRANSACTION 문은 중첩된 트랜잭션 내에서 문이 실행되더라도 트랜잭션 수를 0으로 다시 설정합니다. COMMIT TRANSACTION은 트랜잭션 개수를 0으로 감소시킬 수 있으므로 따라서 로그온 트리거 내에서 COMMIT TRANSACTION 문을 발급하지 않도록 하는 것이 좋습니다.

로그온 트리거 내에서 ROLLBACK TRANSACTION 문을 사용하는 경우 다음을 고려합니다.

  • ROLLBACK TRANSACTION에 대한 모든 데이터 수정 사항은 롤백됩니다. 이러한 수정에는 현재 트리거에서 수행한 수정 내용과 동일한 이벤트에서 실행된 이전 트리거가 수행한 수정 내용이 포함됩니다. 특정 이벤트에 대한 나머지 트리거는 실행되지 않습니다.

  • 현재 트리거는 ROLLBACK 문 다음에 표시되는 남아 있는 모든 문을 계속 실행합니다. 이 문 중에서 데이터를 수정한 경우 수정 사항은 롤백되지 않습니다.

LOGON 이벤트에서 트리거를 실행하는 동안 다음 조건 중 하나가 발생하는 경우 사용자 세션이 설정되지 않습니다.

  • 원래 암시적 트랜잭션이 롤백되거나 실패합니다.

  • 심각도가 20 이상인 오류가 트리거 본문 내에 발생합니다.

로그온 트리거 비활성화

로그온 트리거를 사용하면 데이터베이스 엔진 sysadmin 고정 서버 역할의 멤버를 비롯한 모든 사용자에 대해 에 성공적으로 연결하지 못하도록 효과적으로 차단할 수 있습니다. 로그온 트리거가 연결을 차단 중인 경우 sysadmin 고정 서버 역할의 멤버는 관리자 전용 연결을 사용하거나 최소 구성 모드(-f)로 데이터베이스 엔진 을 시작하여 연결할 수 있습니다. 자세한 내용은 Database Engine Service Startup Options을(를) 참조하세요.

Task 토픽
로그온 트리거를 만드는 방법을 설명합니다. 로그온 트리거는 모든 데이터베이스에서 만들 수 있지만 서버 수준에서 등록되고 master 데이터베이스에 상주합니다. CREATE TRIGGER(Transact-SQL)
로그온 트리거를 수정하는 방법에 대해 설명합니다. ALTER TRIGGER(Transact-SQL)
로그온 트리거를 삭제하는 방법을 설명합니다. DROP TRIGGER(Transact-SQL)
로그온 트리거에 대한 정보를 반환하는 방법을 설명합니다. sys.server_triggers(Transact-SQL)

sys.server_trigger_events(Transact-SQL)
로그온 트리거 이벤트 데이터를 캡처하는 방법을 설명합니다.

참고 항목

DDL 트리거