MSSQLSERVER_17892

적용 대상: SQL Server

세부 정보

attribute
제품 이름 SQL Server
이벤트 ID 버그 #17892
이벤트 원본 MSSQLSERVER
구성 요소 SQLEngine
심볼 이름 SRV_LOGON_FAILED_BY_TRIGGER
메시지 텍스트 트리거 실행으로 인해 로그인 <로그인 이름> 에 로그온하지 못했습니다.

설명

로그온 트리거 코드를 성공적으로 실행할 수 없는 경우 오류 17892가 발생합니다. 로그온 트리거는 LOGON 이벤트에 대한 응답으로 저장 프로시저를 실행합니다. 이 이벤트는 SQL Server 인스턴스에 사용자 세션이 설정된 경우 발생합니다. 다음과 같은 오류 메시지가 사용자에게 보고됩니다.

Msg 17892, 수준 14, 상태 1, 서버 <서버 이름>, 줄 1
트리거 실행으로 인해 로그인 <로그인 이름> 에 로그온하지 못했습니다.

가능한 원인

특정 사용자 계정에 대한 트리거 코드를 실행할 때 오류가 발생하는 경우 문제가 발생할 수 있습니다. 일부 시나리오는 다음과 같습니다.

  • 트리거는 존재하지 않는 테이블에 데이터를 삽입하려고 합니다.
  • 로그인에 로그온 트리거가 참조하는 개체에 대한 권한이 없습니다.

사용자 작업

해당 시나리오에 따라 아래 해결 방법 중 하나를 사용할 수 있습니다.

  • 시나리오 1: 현재 관리자 계정으로 SQL Server에 대한 열려 있는 세션에 액세스할 수 있습니다.

    이 경우 트리거 코드를 수정하는 데 필요한 수정 작업을 수행할 수 있습니다.

    • 예제 1: 트리거 코드에서 참조하는 개체가 없는 경우 로그인 트리거가 성공적으로 실행되도록 해당 개체를 만듭니다.

    • 예제 2: 트리거 코드에서 참조하는 개체가 있지만 사용자에게 권한이 없는 경우 개체에 액세스하는 데 필요한 권한을 부여합니다.

    또는 사용자가 SQL Server에 계속 로그인할 수 있도록 로그인 트리거를 삭제하거나 사용하지 않도록 설정할 수 있습니다.

  • 시나리오 2: 관리자 권한으로 열려 있는 현재 세션이 없지만 SQL Server에서 DAC(전용 관리자 연결)를 사용하도록 설정되어 있습니다.

    이 경우 DAC 연결은 로그인 트리거의 영향을 받지 않으므로 DAC 연결을 사용하여 사례 1에서 설명한 것과 동일한 단계를 수행할 수 있습니다. DAC 연결에 대한 자세한 내용은 다음을 참조 하세요. 데이터베이스 관리자를 위한 진단 연결입니다.

    SQL Server에서 DAC를 사용할 수 있는지 확인하려면 SQL Server 오류 로그에서 다음과 유사한 메시지를 확인할 수 있습니다.

    2020-02-09 16:17:44.150 서버 전용 관리자 연결 지원이 포트 1434의 로컬 수신 대기용으로 설정되었습니다.

  • 시나리오 3: 서버에서 DAC를 사용하도록 설정하거나 SQL Server에 대한 기존 관리자 세션이 없습니다.

    이 시나리오에서 문제를 해결하는 유일한 방법은 다음 단계를 수행하는 것입니다.

    1. SQL Server 및 관련 서비스를 중지합니다.

    2. 시작 매개 변수-m-c사용하여 명령 프롬프트에서 SQL Server를 시작합니다.-f 이렇게 하면 로그인 트리거가 비활성화되고 위의 사례 1에서 설명한 것과 동일한 수정 조치를 수행할 수 있습니다.

      참고 항목

      위의 절차에는 SA 또는 동등한 관리자 계정이 필요합니다.

      이러한 옵션 및 기타 시작 옵션에 대한 자세한 내용은 데이터베이스 엔진 서비스 시작 옵션을 참조하세요.

자세한 정보

로그온 트리거가 실패하는 또 다른 상황은 함수를 사용하는 경우 EVENTDATA 입니다. 이 함수는 XML 및 대/소문자를 구분하여 반환합니다. 따라서 IP 주소를 기반으로 액세스를 차단하려는 다음 로그온 트리거를 만들면 문제가 발생할 수 있습니다.

 CREATE TRIGGER tr_logon_CheckIP  
 ON ALL SERVER  
 FOR LOGON  
 AS
 BEGIN
  IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1  
     BEGIN
         DECLARE @IP NVARCHAR ( 15 );  
         SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));  
         IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )  
         ROLLBACK ;  
     END ;  
 END ;  
 GO

사용자는 인터넷을 통해 다음 트리거 쪽에서 이 스크립트를 복사할 때 대/소문자를 유지하지 않았습니다.

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

결과적으로, EVENTDATA 항상 NULL을 반환하고, 그의 모든 SA 동등한 로그인은 액세스가 거부되었습니다. 이 경우에는 DAC 연결을 사용할 수 없기 때문에 트리거를 삭제하기 위해 위에 나열된 시작 매개 변수로 서버를 다시 시작해야 했습니다.