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 트리거를 사용하여 sysadmin 고정 서버 역할의 멤버를 비롯한 모든 사용자의 데이터베이스 엔진 연결을 효율적으로 막을 수 있습니다. LOGON 트리거가 연결을 막는 경우 sysadmin 고정 서버 역할의 멤버는 전용 관리자 연결을 사용하거나 최소 구성 모드(-f)로 데이터베이스 엔진을 시작하여 연결할 수 있습니다. 자세한 내용은 방법: SQL Server Management Studio에서 관리자 전용 연결 사용SQL Server 서비스 시작 옵션 사용을 참조하십시오.

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>
    연결을 설정할 클라이언트의 호스트 이름을 포함합니다. 클라이언트 이름과 서버 이름이 같을 경우 이 값은 '&lt;local_machine&gt;'입니다. 그렇지 않으면 값은 클라이언트의 IP 주소입니다.

  • <IsPooled>
    연결 풀링을 사용하여 연결이 다시 사용될 경우 1입니다. 그렇지 않으면 값은 0입니다.

LOGON 트리거 만들기, 수정 및 삭제

LOGON 트리거는 모든 데이터베이스에서 만들 수 있지만 서버 수준에서 등록되며 master 데이터베이스에 저장됩니다.

LOGON 트리거를 만들려면

LOGON 트리거를 수정하려면

LOGON 트리거를 삭제하려면

LOGON 트리거에 대한 정보 가져오기

sys.server_triggers 카탈로그 뷰를 쿼리하여 LOGON 트리거에 대한 메타데이터를 볼 수 있습니다.