Bạn có thể sử dụng sys.fn_dblog
để đọc nhật ký giao dịch. Ví dụ bên dưới.
SELECT [RowLog Contents 0],
[RowLog Contents 1],
[Current LSN],
Operation,
Context,
[Transaction ID],
AllocUnitId,
AllocUnitName,
[Page ID],
[Slot ID]
FROM sys.fn_dblog(NULL,NULL)
WHERE Context IN ('LCX_MARK_AS_GHOST', 'LCX_HEAP', 'LCX_CLUSTERED')
AND Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS')
Đối với delete
và insert
hoạt động IIRC [RowLog Contents 0]
chứa toàn bộ hàng được chèn và xóa. Các bản cập nhật phức tạp hơn một chút ở chỗ chỉ có thể ghi một phần hàng.
Để giải mã định dạng hàng này, bạn cần hiểu cách các hàng được lưu trữ nội bộ trong SQL Server. Cuốn sách Nội bộ Microsoft SQL Server 2008 bao gồm điều này trong một số chi tiết. Bạn cũng có thể tải xuống SQL Server Internals Viewer để trợ giúp về vấn đề này (Và tôi tin rằng mã nguồn của Mark Rasmussen của Orca MDF cũng có sẵn mà có lẽ có một số mã để giải mã định dạng hàng nội bộ).
Để biết ví dụ về việc thực hiện điều này trong TSQL, hãy xem bài đăng trên blog này điều này chứng tỏ rằng hoàn toàn có thể trích xuất thông tin hữu ích từ nhật ký miễn là mục tiêu của dự án còn hạn chế. Viết một trình đọc nhật ký hoàn chỉnh có thể đối phó với những thay đổi lược đồ trong các đối tượng và những thứ như cột thưa thớt (và chỉ mục lưu trữ cột trong phiên bản tiếp theo) có thể sẽ là một khối lượng công việc lớn.