MS SQL найти кто удалил данные из базы данных

Найти того кто удалил данные из БД MS SQL оказалось не таку уж и сложно, сначала смотрим вообще были ли операции по удалению из нашей таблицы:

SELECT 
    [Transaction ID],
    Operation,
    Context,
    AllocUnitName
FROM 
    fn_dblog(NULL, NULL) 
WHERE 
    Operation = 'LOP_DELETE_ROWS'

Ищем таблицу в столбце AllocUnitName, смотрим номер транзакции, вычленяем SID:

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

По сиду вычленяем юзера:

SELECT
    *
FROM 
    sysusers
WHERE
    [sid] = @SID

Единый рабочий скрипт:

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

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]

У меня более корректый результат получился если в последнем скрипте делать JOIN к master.sys.syslogins.

.
.
INNER JOIN
master.sys.syslogins u
ON u.[sid] = l.[Transaction SID]

1 Like