是否可以顯示所有修改,在 MS-SQL 中的一個特定表條目上完成?
我正在開發一個應用程序,它使用不同的 DLL,它們每個都在 MS-SQL 數據庫上做一些事情。過了一會兒,數據庫中的某些條目看起來不像我想要的那樣,我想監視所有導致這種情況的修改,例如:
at 12:00:01.234 : modify "Status" from 2 to 3 at 12:00:02.345 : modify "Destination" from "ABC01" to "ABC02". at 12:00:02.456 : modity "Status" from 3 to 4
因為目前,我看到“狀態”為 4,“目的地”為“ABC02”,但我不知道這是何時以及如何發生的。(我的問題類似於要求閱讀 MS-SQL 數據庫的存檔日誌,如果這有意義的話:-))
提前致謝
編輯:一些澄清:
在網際網路上,有很多關於數據庫監控的解釋,但幾乎在所有情況下,想法都是衡量和提高性能。對於我的問題,情況並非如此:我只想逐個了解一個特定表中的數據如何從一個值到另一個值。
編輯:fn_dblog
同時,我已經開始使用
fn_dblog
,如下:SELECT * FROM fn_dblog(null,null) WHERE UPPER(AllocUnitName) LIKE '%TABLENAME_STATUS%'
…但我不知道如何查看時間戳。有人有想法嗎?
關於 fn_dblog 的 Edit2:
就具體
fn_dblog
資訊而言,我為此主題創建了一個新問題。
就目前的情況而言,您將不得不使用現有工具(如擴展事件)來擷取數據更改。當 SQL Server 2022 發佈時, SQL Ledger發生了很大變化。
今天,您正在研究結合使用Audit 工具(隱藏的擴展事件)和擴展事件。查詢性能指標還包括準備語句情況下的參數值,以及批處理情況下的完整查詢字元串。在所有這些之間,您可以看到數據如何隨時間變化。在 2022 年為我們提供分類帳之前,這是完成此任務的方法。
我使用了觸發器和擴展事件(XE) 的組合來跟踪單元格(行/列)組合處的更改。
- 好處是它很高效,您只需擷取相關操作而不需要額外的過濾。
- 缺點是您看不到值的變化 - 只有程式碼導致了它們。可以通過自定義更改
如何
在您的目標表上創建一個觸發器,只檢查您的條件(例如列值已更改)並返回成功。
然後,您使用 event 設置 XE 會話
sp_starting
,過濾觸發器的對象名稱並跟踪空查詢雜湊(RETURN
語句)以及任何審計列。您還可以將語句交換
RETURN
為插入到日誌表中。但是,當然,您必須跟踪新的查詢雜湊。更多資訊在這裡:
https ://straightforwardsql.com/posts/how-to-audit-data-modifications-with-surgical-precision/
其他選項是
- SQL Server 審計- 在後台使用 XE。
- 更改數據擷取(CDC),它從事務日誌中讀取。它沒有告訴您更改的來源。
- 更改跟踪- 比 CDC 更輕量級。預設情況下,它只跟踪行更改。您需要單獨啟用列更新。它沒有告訴您更改的來源。
- 臨時表- 在單獨的歷史表中跟踪表的所有更改。它與其他 SQL 功能有一些限制。它沒有告訴您更改的來源。