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

Mat*_*lko 29 sql-server audit delete transaction

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

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

Mar*_*ith 36

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

SELECT 
    * 
FROM 
    fn_dblog(NULL, NULL) 
WHERE 
    Operation = 'LOP_DELETE_ROWS'
Run Code Online (Sandbox Code Playgroud)

获取您感兴趣的交易的交易 ID,并通过以下方式识别发起交易的 SID:

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

然后从 SID 识别用户:

SELECT
    *
FROM 
    sysusers
WHERE
    [sid] = @SID
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

  • 如果您的数据库处于简单恢复模式,则您无法对非活动事务将在日志中保留多长时间做出任何假设。 (5认同)
  • 事务日志是基本的,而不是可选的。数据库的恢复模式是什么(简单或完整)以及如何配置备份(仅完整或日志备份 + 完整)? (3认同)