如何通过查询“fn_dblog”或DBCC LOG('DataBaseName')打印出一个事务的查询SQL文本?

Tom*_*Tom 2 sql-server-2008 sql-server dbcc

在过去 24 小时内的某个时间点,使用 DB 的几个应用程序之一对客户 SQL Server 2008 (v 9.0 SP4) 进行了一些更改。

它不是特别重要,但如果我可以转储与时间段对应的 SQL 语句,它将代表对这些应用程序如何使用表的有用见解。

我感兴趣的表不会经常更改,因此应用于这些特定表的事务日志的总行数不应非常大。

我看到了“fn_dblog”函数和 DBCC LOG('DataBaseName') 命令,似乎有相当多的相关信息,但我不知道如何进行下一步并让它们生成实际更改的报告.

这篇博文中有一些细节; http://janiceclee.com/tag/fn_dump_dblog/

USE AdventureWorks
    GO
    SELECT [Transaction ID], count(*)
    FROM fn_dblog(DEFAULT, DEFAULT)
    where AllocUnitName LIKE '%Production.TransactionHistory%'--table name
    GROUP BY [Transaction ID]
    HAVING COUNT(*) >= 113443 --(estimated/actual) number of deleted records
Run Code Online (Sandbox Code Playgroud)

但是我没有任何这样的细节,只有表名(如果需要,我可以得到主键)

以及另一篇博客文章,根据表命名使用类似的示例数据; http://www.sqlskills.com/blogs/paul/post/Search-Engine-QA-6-Using-fn_dblog-to-tell-if-a-transaction-is-contained-in-a-backup.aspx

    USE AdventureWorks;

    GO

    SELECT [Current LSN], Operation, [Transaction ID], AllocUnitName FROM fn_dblog (NULL, NULL);

    GO

The log record at that LSN is:

    00000058:00001870:0001  LOP_MODIFY_ROW     0000:00001338  HumanResources.Employee.PK_Employee_EmployeeID

This is obviously in the middle of my contrived transaction - showing that it isn't all in the full backup. The end of the transaction isn't until way later in the log:

    0000005e:00000628:01b1  LOP_MODIFY_ROW     0000:00001338  HumanResources.Employee.PK_Employee_EmployeeID
    0000005e:00000628:01b2  LOP_COMMIT_XACT    0000:00001338  NULL
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 7

事务日志不包含语句,它包含数据库中发生的物理变化。如果您看到指示删除的日志记录,您无法知道这是 DELETE 语句、MERGE 语句还是宽(拆分)UPDATE 语句。如果您看到指示 INSERT 的操作,您将无法知道它是 INSERT (...) VALUES (...) 还是 INSERT (...) SELECT (...) 或 INSERT (. ..) EXEC 或者它是一个 MERGE 或者它是一个广泛的(拆分)更新。等等等等。具体来说,事务日志不打算替代审计跟踪。

转录复制代理具有重构 T-SQL 操作的方法 ,其效果与更改已发表文章的效果相同,但它是如何进行的并不是公开信息。

如果要监视数据更改,请使用Change TrackingChange Data Capture。如果要监视 T-SQL 活动,请使用探查器跟踪