2013-02-19 5 views
0

SQL 로그인 성공 및 실패를 추적하고이를 쿼리 목적으로 SQL 테이블에 저장하려고합니다. 작동하는 쿼리를 작성했지만 내 문제는, 로그인 이름을 도메인에 포함되어있을 때, 그것은 잘 작동하지만 도메인이 포함되어 있지 않으면 추가 텍스트를 추가합니다. 누군가가 내 코드를 검토하고 로그인 이름 뒤에 여분을 제거하는 방법을 알 수 있기를 바랬습니다.SQL 오류 로그의 텍스트에서 로그인 정보 추출

가 반환 무엇의 예 : 도메인 \ BBruning

도메인 \ SQLServ

도메인 \있는 BSmith

도메인 \ JHarris '.

scgWeb '. 이유 : F

cpadmin '입니다. 이유 :

CREATE TABLE [dbo].[#TmpErrorLog] 
([LogDate] DATETIME NULL, 
[ProcessInfo] VARCHAR(20) NULL, 
[Text] VARCHAR(MAX) NULL); 

CREATE TABLE [dbo].[#TmpErrorLog2] 
([LogDate] DATETIME NULL, 
[ProcessInfo] VARCHAR(20) NULL, 
[Text] VARCHAR(MAX) NULL, 
[LoginAttempt] VARCHAR(20) NULL, 
[ServerName] VARCHAR(20) NULL); 


INSERT INTO #TmpErrorLog ([LogDate], [ProcessInfo], [Text]) 
EXEC [master].[dbo].[xp_readerrorlog] 0 ; 

INSERT INTO #TmpErrorLog2 ([LogDate], [ProcessInfo], [Text], [LoginAttempt]) 
Select LogDate, ProcessInfo, Text, SUBSTRING(Text,0,16) as LoginAttempt 
From #TmpErrorLog 
Where LogDate > GETDATE() - 120 and 
[ProcessInfo] = 'Logon' and 
Text like '%Login%' and text not like '%untrusted%' 



INSERT INTO [MyTABLE] ([LogDate], [LoginAttempt], [LoginUser], [ServerName], [Log_date_key]) 
Select 
LogDate, 
Case LoginAttempt When 'Login succeeded' Then 'Successful' ELSE 'Failed' End as LoginAttempt, 
SUBSTRING(SUBSTRING(Text, CHARINDEX('''', Text,1), CHARINDEX('''', Text, 0) - 4),2,50) as LoginUser, @@SERVERNAME, (Convert(INT, LogDate, 112)) 
From #TmpErrorLog2 
Where LogDate Not In(Select LogDate From [MyTable]) 



Drop Table #TmpErrorLog 
Drop Table #TmpErrorLog2 

답변

2

하위 문자열 사용은 최종 선택에서 약간 벗어납니다.

는 당신이 필요로하는 당신은 시작 위치와 종료 위치를 제공했다

SUBSTRING(
    Text, 
    CHARINDEX('''', Text,1)+1, 
    CHARINDEX('''', Text, CHARINDEX('''', Text,1)+1) - CHARINDEX('''', Text,1)-1 
) 

입니다 당신은

SUBSTRING(SUBSTRING(Text, CHARINDEX('''', Text,1), CHARINDEX('''', Text, 0) - 4),2,50) 

이, TSQL은 시작 위치와 반환 소원 문자열의 길이를 필요로한다.

+0

롭, 너는 남자 야. 그 일은 훌륭했습니다. 도와 주셔서 감사합니다!! –