使用SQL 2008 R2
我有一个包含Windows安全事件日志条目的表。可能的事件ID是560,562和564。
这些是用户删除文件时创建的三个事件日志条目。
560包含有关执行删除的用户,源IP,文件名等的大部分数据。但是,560不是确认删除发生的事件。 560是对象打开事件类型。
当用户删除文件时,首先创建560(对象打开),然后创建562(句柄关闭),最后创建564(对象删除)。
所有这三个事件之间的共同点是Handle ID。因此,对于单个删除,您将获得类似于以下内容的内容:
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
我想要来自560事件的UserName和File,但只有当564 w /相同的HandleID时才会这样。
答案 0 :(得分: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
,其中一个或两个查询可能更有用。这取决于您的数据。
答案 1 :(得分:0)
解决此问题的一种方法是使用子查询:
SELECT UserName, File
FROM YourTable
WHERE EventID = 560
AND HandleID IN (
SELECT HandleID
FROM YourTable
WHERE EventID = 564
)