Sql server 通过T-SQL读取SQL事务日志

Sql server 通过T-SQL读取SQL事务日志,sql-server,tsql,Sql Server,Tsql,这是我从备份文件读取SQL事务日志(脱机日志)的脚本 我想让所有插入/更新/删除都由T-SQL执行(排除操作使用SSMS的GUI) 因此,问题是: 我已经测试过这个脚本,它在大多数情况下都能正常工作。你知道有什么错案吗 你有更好的解决办法吗 谢谢你的贡献 DECLARE @From DATETIME, @To DATETIME DECLARE @FilePath NVARCHAR(1000) SET @FilePath = N'D:\abc.BAK' SET @From ='2015/10

这是我从备份文件读取SQL事务日志(脱机日志)的脚本

我想让所有插入/更新/删除都由T-SQL执行(排除操作使用SSMS的GUI)

因此,问题是:

  • 我已经测试过这个脚本,它在大多数情况下都能正常工作。你知道有什么错案吗

  • 你有更好的解决办法吗

    谢谢你的贡献

  • DECLARE @From DATETIME, @To DATETIME
    DECLARE @FilePath NVARCHAR(1000)
    
    SET @FilePath = N'D:\abc.BAK'
    SET @From ='2015/10/01 00:00:00'
    SET @To ='2015/10/31 00:00:00'
    
    SELECT *
    INTO #Log
    FROM fn_dump_dblog (
            NULL, NULL, N'DISK', 1, @FilePath,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
            DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
            
    SELECT  l.[Transaction Name],
                objectName.schemaname AS [Schema],
                objectName.name AS [Object],
            SUSER_SNAME (l.[Transaction SID]) AS [User],
            l.[Begin Time],
            endTime.[End Time],
            l.[Transaction ID]        
    FROM #Log AS l
    INNER JOIN (
                SELECT l.[Transaction ID], l.[End Time]
                FROM #Log AS l
                WHERE Operation = 'LOP_COMMIT_XACT'       
    ) AS endTime ON l.[Transaction ID] = endTime.[Transaction ID]
    INNER JOIN(
          SELECT [Transaction ID],AllocUnitName  FROM #Log AS l
          WHERE AllocUnitName IS NOT NULL
          GROUP BY [Transaction ID], AllocUnitName
    ) AS alloc ON l.[Transaction ID] = alloc.[Transaction ID]
    LEFT JOIN (
          SELECT i.object_id, i.name AS IndexName,o.name,s.name+'.'+o.name+'.'+i.name AS keyname,s.name AS schemaname FROM sys.indexes AS i
          INNER JOIN sys.objects AS o ON i.object_id = o.object_id
          INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
    ) AS objectName ON alloc.AllocUnitName = objectName.keyname
    WHERE Operation = 'LOP_BEGIN_XACT'
          AND [Transaction Name] IN ('INSERT','UPDATE','DELETE')
          AND l.[Begin Time] BETWEEN @From AND @To
    ORDER BY l.[Transaction ID]
    
    DROP TABLE #Log