LOGON 트리거
LOGON 트리거는 LOGON 이벤트에 대한 응답으로 저장 프로시저를 실행합니다. 이 이벤트는 SQL Server 인스턴스에 사용자 세션이 설정된 경우 발생합니다. LOGON 트리거는 로그인의 인증 단계가 완료되었지만 사용자 세션이 실제로 설정되기 전에 발생합니다. 따라서 오류 메시지 및 PRINT 문의 메시지와 같이 일반적으로 사용자에게 전달되는 모든 트리거 내 발생 메시지는 SQL Server 오류 로그로 전달됩니다. 인증에 실패할 경우 LOGON 트리거는 발생하지 않습니다.
LOGON 트리거를 사용하면 로그인 작업 추적, SQL Server에 대한 로그인 제한, 특정 로그인에 대한 세션 수 제한 등의 작업을 수행하여 서버 세션을 감사하고 제어할 수 있습니다. 예를 들어 다음 코드에서 LOGON 트리거는 로그인 login_test가 이미 3개의 사용자 세션을 만든 상태에서 SQL Server에 대한 로그인을 시도하면 해당 요청을 거부합니다.
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 이벤트에 해당합니다. 트리거와 이벤트 알림의 주요 차이점은 트리거는 이벤트와 동기적으로 발생하지만 이벤트 알림은 비동기적으로 발생한다는 점입니다. 즉, 세션이 설정되지 않도록 하려는 경우 등에서 LOGON 트리거를 사용해야 합니다. 이런 경우에는 AUDIT_LOGIN 이벤트의 이벤트 알림을 사용할 수 없습니다.
LOGON 트리거 이벤트 데이터 캡처
LOGON 트리거 내에서 사용할 LOGON 이벤트에 대한 XML 데이터를 캡처하려면 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>
지정된 로그인 이름에 대한 SID(보안 ID)의 base 64로 인코딩된 이진 스트림을 포함합니다.<ClientHost>
연결을 설정할 클라이언트의 호스트 이름을 포함합니다. 클라이언트 이름과 서버 이름이 같을 경우 이 값은 '<local_machine>'입니다. 그렇지 않으면 값은 클라이언트의 IP 주소입니다.<IsPooled>
연결 풀링을 사용하여 연결이 다시 사용될 경우 1입니다. 그렇지 않으면 값은 0입니다.
LOGON 트리거 만들기, 수정 및 삭제
LOGON 트리거는 모든 데이터베이스에서 만들 수 있지만 서버 수준에서 등록되며 master 데이터베이스에 저장됩니다.