如何通過查詢“fn_dblog”或 DBCC LOG(‘DataBaseName’) 列印出事務的查詢 SQL 文本?
在過去 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 Tracking或Change Data Capture。如果要監視 T-SQL 活動,請使用分析器跟踪。