DBILITY

mssql Server log 확인하기 본문

database/mssql

mssql Server log 확인하기

DBILITY 2022. 8. 29. 10:40
반응형

현재 로그에서 db user의 접속통계용으로 사용한다.
master db에 실체 테이블을 생성 후 입력하고 조회하는 것이다.

인덱스가 없고 통계정보가 생성되지 않은 상태에서 TEXT 조회니 느릴 수 있다.

USE MASTER
GO

SET NOCOUNT ON


IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='DB_CONNECT_LOGS' and xtype='U')
BEGIN
	CREATE TABLE DB_CONNECT_LOGS (
		LOG_DATE DATETIME, PROCESS_INFO VARCHAR(1000), LOG_TEXT VARCHAR(MAX)
	)
END
ELSE 
BEGIN
	TRUNCATE TABLE DB_CONNECT_LOGS
END
GO

INSERT DB_CONNECT_LOGS EXEC sp_readerrorlog 0, 1, '', '';
/*
총 4개의 파라메타가 있는데 각 파라메타의 의미는 다음과 같습니다.
@p1 : 0 = 현재 로그, 1 = 보관된 첫번째 로그, 2 = 보관된 두번째 로그...
@p2 : 1 or Null = Error Log, 2 = SQL Agent Log
@p3 and @p4 : Search 키워드, @p3과 @p4가 and 조건
*/

SELECT A.계정,A.접속경로,A.로그인여부, COUNT(*) AS '로그개수'
FROM
(
	SELECT A.*
		  ,SUBSTRING(TEXT,CHARINDEX('[', TEXT),50) AS '접속경로'
		  ,CASE WHEN LEFT(TEXT,10) ='LOGIN SUCC' THEN 'LOGIN SUCCEEDED'
				ELSE LEFT(TEXT,10)
				END AS '로그인여부'
		  ,SUBSTRING(TEXT,(CHARINDEX('"', TEXT)+1), ((CHARINDEX('"', TEXT,CHARINDEX('"', TEXT)+1))-(CHARINDEX('"', TEXT)+1)) ) AS '계정'
	FROM (
			SELECT LOG_DATE, PROCESS_INFO
				  ,REPLACE(LOG_TEXT, CHAR(39) , '"') AS TEXT

			  FROM DB_CONNECT_LOGS
			 WHERE LOG_DATE >='2022-07-22 01:01:01.001' AND LOG_DATE <='2022-08-27 23:59:59.999'
			   AND PROCESS_INFO = 'LOGON'
			   AND LEFT(LOG_TEXT,5) = 'LOGIN'
			   --AND LOG_DATE NOT IN ('2020-12-15 13:11:58.070')  --SUBSTRING 에러시 "계정정보 없음"

	) A
	WHERE 1=1	
) A
GROUP BY A.계정,A.접속경로,A.로그인여부
;

이거 보고 클릭 한번~ 삼대가 재수있을지어다!😎

누르고 복권을 사라! 당첨되면 감사 댓글 부탁~

반응형
Comments