Sql-Server

如何通過查詢“fn_dblog”或 DBCC LOG(‘DataBaseName’) 列印出事務的查詢 SQL 文本?

  • May 13, 2015

在過去 24 小時內的某個時間點,如果可能,使用數據庫的幾個應用程序之一對客戶 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

但是我沒有任何這樣的細節,只有表名(如果需要,我可以得到主鍵)

另一篇部落格文章使用了類似的範例數據,給出了他們的表命名; 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

事務日誌不包含語句,它包含數據庫中發生的物理變化。如果您看到指示刪除的日誌記錄,則您無法知道這是 DELETE 語句、MERGE 語句還是寬(拆分)UPDATE 語句。如果您看到指示 INSERT 的操作,您將無法知道它是 INSERT (…) VALUES (…) 還是 INSERT (…) SELECT (…) 還是 INSERT (. ..) EXEC 或者它是一個 MERGE 或者它是一個寬(拆分)更新。等等等等。具體來說,事務日誌不打算替代審計跟踪。

轉錄複製代理具有重建 T-SQL 操作的方法,其效果與更改已發表文章的 效果相同,但它是如何實現的並不是公開資訊。

如果要監視數據更改,請使用Change TrackingChange Data Capture。如果要監視 T-SQL 活動,請使用分析器跟踪

引用自:https://dba.stackexchange.com/questions/23086