2015-02-06 5 views
0

Использование SQL 2008 R2Сравнение записей в одной таблице SQL

У меня есть таблица, содержащая записи журнала событий безопасности Windows. Возможные идентификаторы событий: 560, 562 и 564.

Это три записи журнала событий, созданные, когда пользователь удаляет файл.

560 содержит большую часть данных о пользователе, который выполнил удаление, IP-адрес источника, имя файла и т. Д. Однако 560 не является событием, которое подтверждает удаление. 560 - это тип события открытого события.

Когда пользователь удаляет файл, сначала создается 560 (объект открытый), затем 562 (дескриптор закрыт) и, наконец, 564 (удаление объекта).

Общая связь между всеми тремя из этих событий - это идентификатор дескриптора. Таким образом, для одного удаления вы будете иметь что-то похожее на следующее:

EventID HandleID UserName    Event   File 
564  000015f7 NT AUTHORITY\SYSTEM Object Delete N/A 
562  000015f7 NT AUTHORITY\SYSTEM Handle Closed N/A 
560  000015f7 DOMAIN\USER   Object Open  \share\filename 

Я хотел UserName и File из 560 события, но только тогда, когда есть 564 Вт/же HandleID.

ответ

0

Одним из способов решения этой проблемы является использование подзапроса:

SELECT UserName, File 
FROM YourTable 
WHERE EventID = 560 
    AND HandleID IN (
    SELECT HandleID 
    FROM YourTable 
    WHERE EventID = 564 
) 
1

Там в много способов сделать это. Вы можете использовать коррелировала подзапрос:

SELECT UserName, File 
FROM EventTableNameNotProvided e1 
WHERE e1.EventID = 560 
    AND EXISTS (SELECT 1 
     FROM EventTableNameNotProvided e2 
     WHERE e2.HandleID = e1.HandleID 
      AND e2.EventID = 564) 

Или автообъединение:

SELECT e1.UserName, e1.File 
FROM EventTableNameNotProvided e1 
JOIN EventTableNameNotProvided e2 
    ON e2.HandleID = e1.HandleID 
WHERE e1.EventID = 560 
    AND e2.EventID = 564 

Либо или оба запроса могут быть более полезными с SELECT DISTINCT. Это зависит от ваших данных.

Смежные вопросы