Sql-Server

是否可以顯示所有修改,在 MS-SQL 中的一個特定表條目上完成?

  • July 11, 2022

我正在開發一個應用程序,它使用不同的 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/

其他選項是

  1. SQL Server 審計- 在後台使用 XE。
  2. 更改數據擷取(CDC),它從事務日誌中讀取。它沒有告訴您更改的來源。
  3. 更改跟踪- 比 CDC 更輕量級。預設情況下,它只跟踪行更改。您需要單獨啟用列更新。它沒有告訴您更改的來源。
  4. 臨時表- 在單獨的歷史表中跟踪表的所有更改。它與其他 SQL 功能有一些限制。它沒有告訴您更改的來源。

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