一尘不染

如何找出谁删除了一些数据 SQL Server

sql-server

我的老板昨天收到一位客户的询问,询问他们如何找出谁删除了他们的 SQL Server 数据库中的一些数据(如果重要的话,它是快速版)。

我认为这可以从事务日志中找到(假设它没有被截断) - 这是正确的吗?如果是这样,您实际上如何找到这些信息?


阅读 182

收藏
2022-11-09

共1个答案

一尘不染

我没有在 Express 上尝试过 fn_dblog,但如果它可用,以下将为您提供删除操作:

SELECT 
    * 
FROM 
    fn_dblog(NULL, NULL) 
WHERE 
    Operation = 'LOP_DELETE_ROWS'

获取您感兴趣的事务的事务 ID,并确定发起事务的 SID:

SELECT
    [Transaction SID]
FROM
    fn_dblog(NULL, NULL)
WHERE
    [Transaction ID] = @TranID
AND
    [Operation] = 'LOP_BEGIN_XACT'

然后从 SID 中识别用户:

SELECT
    *
FROM 
    sysusers
WHERE
    [sid] = @SID

编辑:将所有这些放在一起以查找指定表上的删除:

DECLARE @TableName sysname
SET @TableName = 'dbo.Table_1'

SELECT
    u.[name] AS UserName
    , l.[Begin Time] AS TransactionStartTime
FROM
    fn_dblog(NULL, NULL) l
INNER JOIN
    (
    SELECT
        [Transaction ID]
    FROM 
        fn_dblog(NULL, NULL) 
    WHERE
        AllocUnitName LIKE @TableName + '%'
    AND
        Operation = 'LOP_DELETE_ROWS'
    ) deletes
ON  deletes.[Transaction ID] = l.[Transaction ID]
INNER JOIN
    sysusers u
ON  u.[sid] = l.[Transaction SID]
2022-11-09