2011-03-11 75 views
4

我的同事在工作中給我提出了一個問題,我無法回答(由於很多缺乏經驗),這與追蹤表格上相關字段的變化有關。跟蹤表中的變化

想象一下,我們有3個表,每個表有20個字段。讓我們考慮一下這個例子中的每個表都有兩個字段,一個名爲LastUpdatedOn,另一個名爲LastUpdatedBy。

如果我們想要追蹤這3個表格中的變化,但只追蹤一些特定字段的變化,而不更新每個包含它們最後一個版本的歷史記錄表格,我們如何跟蹤變化這些相關領域,仍然保持通用?

+2

如果您不打算創建歷史記錄表,那麼您希望在哪裏保存歷史記錄? – 2011-03-11 14:35:00

+0

這似乎令人費解,至少對我來說是這樣。我的同事說我們不能使用歷史記錄表來跟蹤這些變化。這裏的事情是,你不需要知道舊的價值是什麼,你只需要知道一個重要的領域已經發生了變化。這就是需要的那種跟蹤。 – Hallaghan 2011-03-11 14:36:34

回答

4

無需爲每個表創建歷史記錄/審計表。您可以有一個單一表表,其中存儲您要跟蹤的字段的表和字段名稱:

audit(audit_id, table_name, field_name, action_flg, updated_by, updated_on, val_before, val_after, pk_value1, pk_value2, pk_value3, pk_value4, pk_value5)

您需要存儲表的主鍵(字段pk_value1pk_value5)以唯一標識已更改的行。如果要跟蹤更新,插入或已刪除的行,則使用action_flg。 Oracle在其某些產品中使用此表結構。

例如,假設你有一個表person(person_id, name, email),你需要跟蹤到外地email所做的更改:

  1. 一個新的人(id=1)創建:insert into audit(1, 'person', 'email', 'A' /* add */, 'USER', '11-03-2011', null, '[email protected]', 1, null, null, null, null);

  2. E-人的郵件1已更新: insert into audit(2, 'person', 'email', 'C' /* change */, 'USER', '12-03-2011', '[email protected]', '[email protected]', 1, null, null, null, null);

  3. 現在假設perso的電子郵件ñ70更新: insert into audit(3, 'person', 'email', 'C' , 'USER', '12-03-2011', '[email protected]', '[email protected]', 70, null, null, null, null);

+0

謝謝,我很好。 – Hallaghan 2011-03-11 14:59:01

+2

這是一個有效的選擇,但是像所有事情都有消極和積極的一面。例如,如果您有成千上萬的表將審計寫入一張表,那麼您可以創建一個非常好的熱點。 – Kuberchaun 2011-03-11 15:20:52

2

如果你不需要知道發生了什麼變化,只是一些重要的領域發生了變化,那麼就增加一個時間戳列,LastImportantUpdateOn或類似的東西。然後添加一個觸發器來將編輯添加到被認爲「重要」的字段並寫入新的時間戳。

如果您需要知道哪個字段發生了變化,請爲每個字段添加新的時間戳,而不是通常添加一個。