Transaction-Log
事務日誌是如何插入的?
我有一個工作中的 ms-access 數據庫,它有一個作為事務日誌的表。
該表包含以下欄位:
日期 - 交易發生的日期。
- Table_Name - 更改欄位的表的名稱。
- Table_Field - 表中已更改的欄位。
- Old_Value - 欄位的原始值(如果有)。
- New_Value - 在此事務期間設置的欄位的新值。
現在在這樣的事務日誌表中,這些記錄通常是由修改數據庫的系統的程式 API 設置的,是數據庫本身的功能,還是被數據庫觸發器之類的東西觸發?還是這取決於正在使用的 rdbms?
首先,正確的術語是審計表(或者可能是審計歷史)。事務日誌是完全不同的東西(這是 DBMS 的核心部分,它記錄所有活動事務以保證 ACID 屬性) - DBMS 事務日誌(它是二進制的,非常難以閱讀的格式)一旦被重用不再需要(“一旦不再需要”有點模糊,但是關於事務日誌語義的完整論文有點超出了這個答案的範圍),只要你不明確,審計歷史就會永遠存在桌子。
要回答實際問題 - 應該在數據庫內部完成(觸發器是最簡單的方法)。其基本原因是,無論哪個應用程序正在使用數據庫,您都希望數據中不可或缺的任何事情(即約束、安全規則、審計歷史等)發生。
此外:
Old_Value
和New_Value
欄位使用什麼數據類型?您在那裡使用的審計表的樣式將導致您插入/更新/刪除的每一行的每個欄位在表中佔一行,這意味著您的審計歷史表的增長速度將與其他所有表一樣快表放在一起(然後是一些)。您需要密切注意它以確保它不會失控(我建議定期清理表格 - 當然,只有在您備份它之後)。
另一種選擇(如果您需要經常參考審計歷史,我可能會使用)是為數據庫中的每個表都有一個審計表 - 所以如果你有
Person(ID, Name)
,你就會有audit_Person(whoChanged, whenChanged, ID, Name)
,然後在更新或刪除時,儲存更改前行的狀態(您不需要插入,因為您可以在表中查看目前狀態),以及更改它的使用者的登錄名和時間。
- 這意味著不再有包含 20 億行的審計表,並且使查詢審計歷史變得更加直覺(您可以將整行恢復為一個整體,而不必逐個欄位地進行),但確實存在重複架構更改的缺點(如果您將一列添加到
Person
,您還需要將其添加到“audit_Person”),並且很可能總體上比單表方法大。