2008-09-01 129 views
25

跟蹤數據庫表中更改的最佳方式是什麼?如何跟蹤數據庫表中的數據更改

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

+2

一些很好的討論:http://discuss.joelonsoftware.com/default.asp?design.4.483891 .10 – 2011-03-14 04:32:37

+0

另請參見[更新日誌/審計數據庫表的最佳設計?](https://stackoverflow.com/questions/201527/best-design-for-a-changes-auditing-database-table) – user 2017-09-14 07:51:20

回答

3

通常,如果您的應用程序被構建爲圖層,請讓數據訪問層調用數據庫服務器上的存儲過程以編寫數據庫更改的日誌。

在支持這種事情的語言中,aspect-oriented programming可以是用於這類應用程序的一種很好的技術。審計數據庫表更改是您通常希望記錄所有操作的操作類型,所以AOP可以很好地工作。

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

使用存儲過程來處理這個問題也是完全可行的,儘管可能有一些工作需要將用戶憑證傳遞給數據庫本身。

+1

看起來像如果您希望允許用戶查看自己的歷史記錄或其他人的歷史記錄,則他們無法訪問日誌文件。 – 2011-03-14 04:15:03

3

你在這裏有幾個問題沒有很好地相互關聯。

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

你想要的另一件事是知道哪個用戶作出了改變。通常你的觸發器不會知道這一點。我假設如果你想知道哪個用戶改變了一段數據,那麼可能有多個用戶可以改變相同的數據。

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

確保使用一個事務,以便最終不會發生無需插入即可完成更新的情況,或者如果您執行的是相反的順序,則不會在沒有更新的情況下插入。

0

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

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

4

我經常見到的一種方法是有審計表。然後,您可以顯示已更改內容,更改內容以及更改內容,或者任何您想要的內容。然後,您可以編寫一個觸發器來執行實際日誌記錄。如果正確完成,不要太痛苦......

不管你怎麼做,它的種類取決於你的用戶如何連接到數據庫。他們是通過應用程序中的安全上下文使用單個應用程序用戶嗎?他們是使用自己的域帳戶連接的,還是應用程序只讓每個人都使用通用的SQL帳戶連接?

如果您無法從數據庫連接中獲取用戶信息,那會更加痛苦。然後你可以看看在應用程序中進行日誌記錄,所以如果你有一個叫做「CreateOrder」的進程或者其他的東西,你可以登錄到Order_Audit表或者其他的東西。

在應用程序內部完成所有這些操作,可以讓您從應用程序外部進行更改,但如果您有多個應用程序全都使用相同的數據,而您只是想查看您的更改是什麼這就是你想要的... < 聳肩>

雖然祝你好運!

--Kevin

1

在研究這個同樣的問題,我發現了一個討論here非常有用的。它建議設置一個用於跟蹤更改的並行表,其中每個更改跟蹤表都具有與正在跟蹤的列相同的列,以及由誰更改列的時間,以及是否已刪除列。 (這應該是可能產生的架構對於更或多或少自動使用您預先存在的腳本的regexed後續版本。)

0

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

https://tabledependency.codeplex.com/

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

-1

如果所有的變化都來自php。您可以使用class在查詢之前記錄evry INSERT/UPDATE/DELETE。這將是節省行動NEWVALUE屬性oldValue日期系統(如果需要), ipUserAgent的clumnReferenceoperatorReferencevalueReference。所有需要記錄的表/列/動作都是可配置的。

1

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

  1. 創建person_log表

    創建表person_log(日期DATETIME2,SID INT);

  2. 創建人上表中的觸發器將插入一行到person_log表每當Person表得到更新:

    上dbo.Person
    創建觸發器TR的更新
    作爲 INSERT INTO person_log(日期, SID)從插入

選擇updatedDTTM,personSID任何更新後,查詢person_log表,你將能看到更新得到了personSid。 與插入,刪除相同。

上面的例子是SQL,讓我知道任何疑問的情況下,或使用此鏈接:這裏 http://www.4guysfromrolla.com/webtech/042507-1.shtml