簡體   English   中英

如何跟蹤數據庫表中的數據更改

[英]How to track data changes in a database table

跟蹤數據庫表中更改的最佳方法是什么?

想象一下,您有一個應用程序,其中用戶(在應用程序的上下文中而不是數據庫用戶)能夠更改存儲在某個數據庫表中的數據。 跟蹤所有更改歷史記錄的最佳方法是什么,以便您可以顯示哪個用戶在何時更改哪些數據如何?

通常,如果您的應用程序是分層結構,請讓數據訪問層調用數據庫服務器上的存儲過程來寫入數據庫更改的日志。

在支持這種事物的語言中, 面向方面的編程可以是用於這種應用的好技術。 審計數據庫表更改是您通常要為所有操作記錄的操作類型,因此AOP可以非常好地工作。

請記住,記錄數據庫更改將創建大量數據,並會降低系統速度。 根據應用程序的大小,使用消息隊列解決方案和單獨的數據庫來執行審計日志可能是明智的。

使用存儲過程來處理這一點也是完全可行的,盡管可能有一些工作涉及將用戶憑據傳遞到數據庫本身。

我經常看到的一種方法是擁有審計表。 然后你可以顯示改變了什么,改變了什么,改變了什么,或者你想要的任何東西:)然后你可以編寫一個觸發器來進行實際的記錄。 如果做得好,不要太痛苦......

不管你怎么做,都取決於你的用戶如何連接到數據庫。 他們是否通過應用程序中的安全上下文使用單個應用程序用戶,他們是否使用域中的自己的帳戶進行連接,或者應用程序是否只讓所有人都使用通用sql帳戶進行連接?

如果您無法從數據庫連接獲取用戶信息,那就更難了。 然后你可能會看看在應用程序中進行日志記錄,所以如果你有一個名為“CreateOrder”的進程或其他什么,你可以登錄Order_Audit表或其他任何東西。

在應用程序中完成所有操作可以讓您自己更多地了解應用程序外部所做的更改,但如果您有多個應用程序都使用相同的數據而您只是想看看您的更改是什么,也許這就是您想要的...... < 聳肩 >

祝你好運!

--Kevin

在研究同樣的問題時,我發現這里的討論非常有用。 它建議使用並行表集來跟蹤更改,其中每個更改跟蹤表具有與其跟蹤的列相同的列,以及更改它的列,何時以及是否已刪除。 (應該可以通過使用預先存在的腳本的regexed-up版本來自動生成這種模式。)

你在這里遇到一些與彼此無關的問題。

在基本數據庫級別,您可以通過使用單獨的表來跟蹤更改,該表通過INSERT / UPDATE / DELETE語句上的觸發器添加一個條目。 這是跟蹤數據庫表更改的一般方法。

您想要的另一件事是知道哪個用戶進行了更改。 通常你的觸發器不會知道這一點。 我假設如果你想知道哪個用戶改變了一個數據,那么多個用戶可能會改變相同的數據。

沒有正確的方法可以做到這一點,您可能希望有一個單獨的表,當用戶更新另一個表中的某些數據時,您的應用程序代碼將插入記錄,包括更改記錄的用戶,時間戳和ID。

確保使用事務,這樣您就不會在沒有插入的情況下完成更新的情況,或者如果您執行相反的順序,則不會在沒有更新的情況下進行插入操作。

假設我有一個包含10個列的Person表,其中包括PersonSid和UpdateDate。 現在,我想跟蹤Person Table中的任何更新。 這是我使用的簡單技術:

  1. 創建person_log表

    create table person_log(date datetime2,sid int);

  2. 在Person表上創建一個觸發器,只要Person表更新,它就會在person_log表中插入一行:

    在dbo.Person上創建觸發器tr
    更新
    當插入person_log(date,sid)時,選擇updatedDTTM,插入PersonSID

在任何更新之后,查詢person_log表,您將能夠看到更新的personSid。 您可以為插入,刪除做同樣的事情。

以上示例適用於SQL,如有任何疑問或請使用此鏈接,請通知我: http//www.4guysfromrolla.com/webtech/042507-1.shtml

跟蹤日志在一個單獨的表中(帶有ID列,可能帶有時間戳)?

您是否也想要撤消更改 - 也許預先創建撤消語句(每個INSERT為DELETE,每個正常UPDATE為(un-)UPDATE)並將其保存在跟蹤中?

讓我們試試這個開源組件:

https://tabledependency.codeplex.com/

TableDependency是一個通用的C#組件,用於在指定數據庫表的內容發生更改時接收通知。

如果所有的變化都來自php。 您可以在查詢之前使用來記錄evry INSERT / UPDATE / DELETE。 它將保存動作newValueoldValue日期系統 (如果需要), ipUserAgentclumnReferenceoperatorReferencevalueReference 需要記錄的所有表/列/操作都是可配置的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM