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)