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)
事务日志不包含语句,它包含数据库中发生的物理变化。如果您看到指示删除的日志记录,您无法知道这是 DELETE 语句、MERGE 语句还是宽(拆分)UPDATE 语句。如果您看到指示 INSERT 的操作,您将无法知道它是 INSERT (...) VALUES (...) 还是 INSERT (...) SELECT (...) 或 INSERT (. ..) EXEC 或者它是一个 MERGE 或者它是一个广泛的(拆分)更新。等等等等。具体来说,事务日志不打算替代审计跟踪。
转录复制代理具有重构 T-SQL 操作的方法 ,其效果与更改已发表文章的效果相同,但它是如何进行的并不是公开信息。
如果要监视数据更改,请使用Change Tracking或Change Data Capture。如果要监视 T-SQL 活动,请使用探查器跟踪。