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에 대한 기존 관리자 세션이 없습니다.
이 시나리오에서 문제를 해결하는 유일한 방법은 다음 단계를 수행하는 것입니다.
SQL Server 및 관련 서비스를 중지합니다.
시작 매개 변수
-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 연결을 사용할 수 없기 때문에 트리거를 삭제하기 위해 위에 나열된 시작 매개 변수로 서버를 다시 시작해야 했습니다.