2009-07-01 30 views
7

對於我正在處理的項目,我被要求創建對記錄所做的所有更改的審計跟蹤。這是我第一次創建審計線索,所以我一直在做這方面的大量研究。我將如何使用審計跟蹤來顯示哪些字段曾被編輯?

該應用程序將在PHP/MSSQL中開發,並且流量很低。

從我的閱讀,我幾乎決定有一個審計表,並使用觸發器來記錄表中的變化。是

在應用中顯示這兩個要求如下:

  1. 能夠看到日誌的一個領域所做的所有更改(我非常知道如何做到這一點)

  2. 在應用程序中查看記錄時,能夠看到記錄中任何已更改的字段(可能還有其他信息,如最後一次更改的日期)旁邊的指示符。

項目#2是目前給我的悲傷。沒有爲每個字段(或需要很長時間才能執行的非常長的嵌套查詢)做單獨的查詢,任何人都沒有建議最佳的方式來做到這一點? (我曾想過爲表格中的每個字段添加一個額外的「ModifiedFlag」字段,如果字段曾經被編輯過,它將作爲布爾指示符,但是這看起來像是很多開銷。

回答

4

我會對待從儘可能多的實際域信息分開審覈信息

要求#1: 我想你會創建額外的審計表以記錄更改 埃裏克的建議是一個很好的一個,創建一個使用的審計信息觸發器在SQL數據庫中,這樣你的應用程序就不需要知道審計邏輯了,

如果您的數據庫不支持觸發器,那麼您可能正在使用某種持久性或數據庫層。這也是一個放置這種邏輯的好地方,同樣可以最小化正常的應用程序代碼和審計代碼之間的依賴關係。

要求#2: 至於顯示的指標:我不會在表中存儲實際的布爾字段。 (這將導致依賴的種種你正常應用程序代碼,您審計跟蹤代碼之間存在。)

我會盡量讓負責顯示窗體的代碼也負責顯示在審計數據現場級別。這會導致查詢開銷,但這是顯示這一額外信息層的成本。也許你可以通過向審計信息中添加元數據來使數據庫開銷最小化,以便於檢索。

一些大Enterprisy應用程序,我維持大致使用如下結構:

  • 甲對應於一個記錄的一個表中的變化改變頭表。

字段:

changeId, changeTable, changedPrimaryKey, userName, dateTime 

- 對應於該被改變的字段的改變字段的表。

領域:

changeId, changeField, oldValue, NewValue 

示例內容:

更改標題:

'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30' 

更改項目:

'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy' 
'1', 'Author', 'Duglas Adasm', 'Douglas Adams' 

這種結構既可以方便查看審計線索,又可以輕鬆檢索以顯示所需的指標。一個查詢(Header和Items表中的內部連接)足以檢索所有信息以單一形式顯示。 (甚至當你的顯示標識的列表的表)

+0

爲了便於檢索哪些字段被更改,也許我可以創建一個觸發器,它在創建時在主表中和單獨的「原始」表中存儲初始記錄?然後爲了顯示,我可以從兩個表('main'和'originals')中檢索記錄並在代碼中比較它們以標記相應的字段? – Kirsehn 2009-07-07 22:10:33

+0

這是可能的,但是然後對於要存儲的每個事物你都會有兩個表格,而且只有在創建記錄後才能看到許多字段已更改。 我的答案中提到的解決方案允許您創建詳細的審計跟蹤,以顯示哪些字段隨時間發生了變化以及這些字段具有的值。換句話說,你建立了一個歷史。此外,您不必爲所有內容創建兩張表,只需要「主」表和您的審計線索標題和項目表 – dwergkees 2009-07-08 22:20:58

2

作爲一般要求萎靡不振改變現場「聞香」有點奇怪。如果記錄長期存在並隨時間而改變,那麼最終所有的字段都傾向於被標記。因此,我想知道用戶如何理解每個領域的一組簡單指標。

這種思維方式讓我懷疑你所存儲的數據需要如你所描述的那樣,記錄下所有更改的真實審計跟蹤,而第一個真正的挑戰是決定如何呈現信息給用戶。

我覺得你準備某種aggregateOfTheAuditTrail數據的想法很可能是非常有用的。問題是每個記錄的標誌是否足夠?如果用戶的主要訪問權限是通過列表,那麼也許只需突出顯示已更改的記錄以便以後深入查看即可。或記錄值的最後一次改變,因此,只有最近更改記錄突出顯示的日期 - 全部返回給用戶的真正需求是什麼。我很難想象3年前記錄發生變化的情況與上週發生變化的記錄相差無幾。

那麼當我們來到鑽到一個記錄。再次,一個簡單的標誌每個領域聽起來不是很有用(雖然你的域名,你的要求)。如果是這樣,那麼你的總結想法是好的。我的猜測是,對字段的一系列更改以及記錄的整體更改序列更有趣。員工有加薪,員工感動部門,員工晉升=三個獨立的業務活動或一個?

如果需要不僅僅是一個簡單的標誌更多的東西,然後我懷疑,你只需要返回整個(或近期)審計線索備案,讓UI弄清楚如何呈現。

所以,我最初的想法:有些類型的簡要記錄的滾動維護聽起來是個好主意。必要時維護在後臺線程或批處理作業中。我們認爲每次都不需要進行全面的審計跟蹤就可以成爲業務有用的用戶。然後進行詳細分析,我們允許檢索部分或全部線索。

0

就我個人而言,我會讓追蹤變得簡單,而且報道很時髦。

用戶每次插入一條記錄,你犯了一個插入到審計表,該表

'I', 'Date', 'User', 'Data column1','Data Column2', etc. 

這是假設該表的結構不會隨時間變化(關於量dataColumns)則

對於更新,只需插入

'U', 'Date', 'User', 'Data column1', etc 

插入哪些用戶剛輸入的更新。

然後,插入和更新後,您將有以下

'I','May 3 2009','BLT','person005','John','Smith','Marketing' 
'U','May 4 2009','BLT','person005','John','Smith','Accounting' 

然後,它只是一個簡單的報告顯示,獨特的個人記錄「person005」已插入和更新,其中他們的部門已更新。

由於系統使用率較低,因此只需更換一個簡單插件即可實現更復雜的報表過程,但不會影響性能。這種風格仍然適用於更高的流量系統,因爲編輯時的額外負載是最小的,而報告更改的更高強度的工作量並不像更新那樣頻繁,因此係統不會崩潰。