2010-01-07 3 views
0

내 ERP 시스템에는 다음 정보를 M2MDeleteLog 테이블에 삽입하는 반가운 삭제 추적 시스템이 있습니다. 나는 단순화를 위해 RecordId와 같은 불필요한 컬럼을 생략했다.반쯤 구운 시스템으로 삭제 감사 시도

LogDate   Workstation  LogInfo 
    1/7/2010 11:01:51 TECH-M2MTEST Deleting 1 Rows From SOMast 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOMAST from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Deleting 1 Rows From SOItem 
    1/7/2010 11:01:51 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:01:51 TECH-M2MTEST Deleting 1 Rows From SOItem 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOMAST from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Deleting 1 Rows From SOMast 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Deleting 1 Rows From SOItem 
    1/7/2010 11:01:00 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:01:00 TECH-M2MTEST Deleting 1 Rows From SOItem 
    1/7/2010 11:00:29 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOMAST from form frmSo Parameters: NONE 
    1/7/2010 11:00:29 TECH-M2MTEST Deleting 1 Rows From SOMast 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SODBOM from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SORELS from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Deleting 1 Rows From SOItem 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Unqualified M2MDELETE by D.STEIN in SOITEM from form frmSo Parameters: NONE 
    1/7/2010 11:00:28 TECH-M2MTEST Deleting 1 Rows From SOItem 

불행하게도, 관련 정보의 대부분은 1 개 텍스트 필드에 있습니다. 첫 번째 단계는 LogInfo 필드에서 사용자 (D.STEIN), 화면 (SOMAST) 및 화면 (frmso)을 가져 오는 것입니다. 그 부분은 상대적으로 쉽습니다.

내가 원하는 일은 15 분마다 실행되는 예약 된 작업을 만들어 의심스러운 활동을 찾는 것입니다. 나는 의심스러운 활동을 사용자 당 15 분 간격으로 3 번의 삭제로 정의 할 것입니다.

하지만 잠깐! 더있다!

내가 제공 한 데이터에는 삭제 간격이 1 분 미만인 삭제 이벤트가 3 개뿐입니다. 마지막 삭제 이벤트가 지난 20 초 후에 적어도 20 초가 지났다고 정의합니다.

LogDate를 평가하여 15 분 전으로 돌아가서 사용자 당 삭제 이벤트 수를 계산하면 특정 사용자에 대해 3 개 이상 기록 될 때 관리자에게 알릴 수 있습니까?

답변

1

편집 : 아, 촬영, 방금 SQL2K 태그를 발견했습니다. 예제 1은 여전히 ​​작동하지만 예제 2는 작동하지 않습니다. 흠 .. 우리가 어떻게 이걸 치료할 수 있니 .....?

편집 : 고정!

편집 : 더 좋음!

SELECT UserName, LogDate 
FROM #parsed_data a 
WHERE EXISTS (
    SELECT * FROM #parsed_data b 
    WHERE a.UserName = b.UserName 
    AND b.LogDate < a.LogDate 
    AND DATEDIFF(MINUTE,b.LogDate,a.LogDate) <= 15 
    HAVING COUNT(*) >= 2 
) 

(당신은 인덱스가 있어야합니다 텍스트 필드를 구문 분석 한 Asuming

,이 쿼리는 당신에게 15 분 창에 동일한 사용자가 최소 2 삭제가 선행 된 모든 삭제를 줄 것이다 (UserName LogDate), btw)

20 초 이상 간격을 두어 삭제하는 것만 큼 간단하지 않습니다. 아마 이것과 비슷한 것? Quassnoi에 의해 this에 따라

SQL2K :

SELECT a.UserName, a.LogDate, b.LogDate, c.LogDate --, etc 
FROM #parsed_data a 
JOIN #parsed_data b 
    ON b.RecordId = (
    SELECT TOP 1 b0.RecordId FROM #parsed_data b0 
    WHERE b0.UserName = a.UserName AND b0.LogDate < a.LogDate1 
     AND DATEDIFF(MINUTE,b0.LogDate,a.LogDate) <= 15 
     AND DATEDIFF(SECOND,b0.LogDate,a.LogDate) >= 20 
    ORDER BY b0.LogDate DESC 
    ) 
JOIN #parsed_data c 
    ON c.RecordId = (
    SELECT TOP 1 c0.RecordId FROM #parsed_data c0 
    WHERE c0.UserName = b.UserName AND c0.LogDate < b.LogDate 
     AND DATEDIFF(MINUTE,c0.LogDate,a.LogDate) <= 15 
     AND DATEDIFF(SECOND,c0.LogDate,b.LogDate) >= 20 
    ORDER BY c0.LogDate DESC 
    ) 

SQL2005가/2008 CROSS이 적용 십자가

SELECT a.UserName 
, a.LogDate AS LogDate0 -- current 
, b.LogDate AS LogDate1 -- prior 
, c.LogDate as LogDate2 -- prior prior 
FROM #parsed_data a 
CROSS APPLY (
    SELECT TOP 1 b.LogDate FROM #parsed_data b 
    WHERE b.UserName = a.UserName 
    AND b.LogDate < a.LogDate 
    AND DATEDIFF(MINUTE,b.LogDate,a.LogDate) <= 15 
    AND DATEDIFF(SECOND,b.LogDate,a.LogDate) >= 20 
    ORDER BY b.LogDate DESC 
) b 
CROSS APPLY (
    SELECT TOP 1 c.LogDate FROM #parsed_data c 
    WHERE c.UserName = a.UserName 
    AND c.LogDate < b.LogDate 
    AND DATEDIFF(MINUTE,c.LogDate,a.LogDate) <= 15 
    AND DATEDIFF(SECOND,c.LogDate,b.LogDate) >= 20 
    ORDER BY c.LogDate DESC 
) c 

가 적용, 정말 다른 필드를 추가 할 수 있습니다 TOP 1 LogDate...ORDER BY LogDate DESC보다는 MAX(LogDate)을 사용 RecordId, Workstation 등과 같은 결과 세트로 변환합니다.